魔术命令%timeit非常适合以交互方式测量代码执行时间.但是,我想得到结果,%timeit以便绘制结果.timeit.timeit允许这样做,但没有迭代次数的自动缩放和结果的规范化%timeit.
是否有一个内置函数可以计算一段代码,它还会自动调整它执行的迭代次数,并返回一个标准化结果?
假设您可以使用/导入 IPython,并且您只想创建一个使用%timeit魔法的无头脚本,您可以执行以下操作。
假设文件 testme.py 中包含以下内容:
from IPython import get_ipython
def myfun(x):
return x**x
val = 12.3
out = get_ipython().run_line_magic("timeit","-o myfun({})".format(val))
#do something with out, which will be a TimeitResult object
Run Code Online (Sandbox Code Playgroud)
然后你可以非交互地运行脚本:
ipython testme.py
Run Code Online (Sandbox Code Playgroud)
magic %timeit命令提供了一个-o选项:
-o:返回TimeitResult,可以将其存储在变量中以更详细地检查结果。
它仍然会打印结果,但也会返回结果,以便可以将其捕获到变量中。魔术命令的语法受到一些限制,但是您可以list通过将变量分配给变量并将该变量附加到列表中来收集不同的结果:
res = []
for i in range(3):
a = %timeit -o 10*10
res.append(a)
# 10000000 loops, best of 3: 61 ns per loop
# 10000000 loops, best of 3: 61.1 ns per loop
# 10000000 loops, best of 3: 60.8 ns per loop
Run Code Online (Sandbox Code Playgroud)
然后访问res:
print(res)
# [<TimeitResult : 10000000 loops, best of 3: 61.2 ns per loop>,
# <TimeitResult : 10000000 loops, best of 3: 61.3 ns per loop>,
# <TimeitResult : 10000000 loops, best of 3: 61.5 ns per loop>]
Run Code Online (Sandbox Code Playgroud)
这些结果中的每一个都有几个属性,可能值得关注:
print(res[0].all_runs)
# [0.6166532894762563, 0.6102780388983005, 0.6370787790842183]
print(res[0].best)
# 6.102780388983005e-08
print(res[0].compile_time)
# 0.00020554513866197934
print(res[0].loops)
# 10000000
print(res[0].repeat)
# 3
print(res[0].worst)
# 1.1170931449020795e-06
Run Code Online (Sandbox Code Playgroud)
例如,要绘制最佳时间,您需要创建一个包含最佳值的新列表:
res_best_times = [result.best * 1e9 for result in res]
# "* 1e9" to get the result in nanoseconds
print(res_best_times)
# [61.2, 61.3, 61.5]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1719 次 |
| 最近记录: |