如何在python 中执行随机代码块而又不求其字符串化。我很可能对 eval 或 exec 感兴趣。
因此,用例将是提供代码块的计时-但不需要先将代码块转换为字符串的技巧:
def formatTimeDelta(td):
return '%d.%d' %(td.total_seconds() , int(td.microseconds/1000))
def timeit(tag, block):
def getNow(): return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
startt = datetime.datetime.now()
print('Starting %s at %s..' %(tag,getNow()))
block # Execute the code!
duration = formatTimeDelta(datetime.datetime.now() - startt)
print('Completed %s at %s with duration=%s secs' %(tag,getNow(), duration))
所以我们将使用类似的东西:
给出一个“随机”代码块
def waitsecs(nsecs):
import time
time.sleep(nsecs)
print('I slept %d secs..' %nsecs)
timeit('wait five secs', (
waitsecs(5)
))
我相信我过去曾经做过所有事情,但似乎无法将其挖掘出来。.
答案 0 :(得分:3)
timeit.Timer
正是这样做的。
from time import sleep
from timeit import Timer
print(Timer(lambda: sleep(5)).repeat(1, 1))
# [5.000540999999999]
repeat
只是计时功能的一种方法,请阅读链接的文档以获取其他可用方法。
答案 1 :(得分:1)
我找到的最简单的方法是在ipython或Jupyter笔记本中使用magic command %timeit
。您可以根据需要指定重复和循环次数:
$ ipython
In [1]: import time
In [2]: %timeit -n1 -r1 time.sleep(5)
5 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
In [3]: %timeit [i**2 for i in range(10000)]
8.12 ms ± 14.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
您不需要任何lambda,任何已定义的函数或任何字符串化的代码。
答案 2 :(得分:0)
使用装饰器,例如: @timeit装饰器:
new BigDecimal(23.11)
在方法中添加装饰器:
23.1099999994315658113818187512921995859375
答案 3 :(得分:0)
您可以将Callable发送到timeit.timeit()
函数,但如果没有属性,则只能发送 。如果它具有任何属性,则应使用设置代码。
timeit.timeit()
函数具有setup attribute。您可以在timeit
Timer
对象开始工作之前发送代码(但仍为字符串形式)以“评估”它。这是示例:
import timeit
s = """
import math
def waka(number):
return math.sqrt(number)
"""
timeit.timeit('waka(100)', setup=s)
timeit.timeit()
的工作方式:
使用给定的语句,设置代码和计时器函数创建一个Timer实例,并通过执行数字来运行其timeit()方法。可选的globals参数指定在其中执行代码的名称空间。