%timeit 在代码中等效
%timeit equivalent in code
魔术命令 %timeit
非常适合以交互方式测量代码执行时间。但是,我想获得 %timeit
的结果以便绘制结果。 timeit.timeit
也允许这样做,但没有 %timeit
具有的迭代次数的自动缩放和结果的归一化。
是否有一个内置函数可以对一段代码进行计时,它还可以自动调整它执行的迭代次数,并且returns一个标准化的结果?
神奇的 %timeit
命令提供了一个 -o
选项:
-o: return a TimeitResult that can be stored in a variable to inspect the result in more details.
它仍然会打印结果,但也会 return 结果,以便可以在变量中捕获它。魔术命令的语法有点受限,但您可以通过将其分配给变量并将该变量附加到列表来在 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
然后访问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>]
这些结果中的每一个都有几个可能感兴趣的属性:
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
例如,要绘制最佳时间,您需要创建一个包含最佳值的新列表:
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]
假设您可以 use/import 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
然后您可以 运行 非交互脚本:
ipython testme.py
使用细胞魔法%%
在:
%%timeit -o
res = []
for i in range(5):
a = 10*10
res.append(a)
输出:
526 ns ± 44.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
<TimeitResult : 526 ns ± 44.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)>
变量下划线'_'存储最后一个表达式值
在:
result = _
result
输出:
<TimeitResult : 526 ns ± 44.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)>
现在我们可以从属性中获取更多数据(help(result)
)
在:
print(result.average) # 2.358365715216288e-06
print(result.stdev) # 5.159462070683934e-07
print(result.timings) #[3.5457100011626608e-06, ..., 2.4937099988164847e-06]
print(result.all_runs) # [0.0003545710001162661, ... 0.00024937099988164846]
print(result.best) # 2.003900021442676e-06
print(result.compile_time) # 0.00030000000000995897
print(result.loops) # 100
print(result.repeat) # 7
print(result.worst) # 3.5457100011626608e-06
魔术命令 %timeit
非常适合以交互方式测量代码执行时间。但是,我想获得 %timeit
的结果以便绘制结果。 timeit.timeit
也允许这样做,但没有 %timeit
具有的迭代次数的自动缩放和结果的归一化。
是否有一个内置函数可以对一段代码进行计时,它还可以自动调整它执行的迭代次数,并且returns一个标准化的结果?
神奇的 %timeit
命令提供了一个 -o
选项:
-o: return a TimeitResult that can be stored in a variable to inspect the result in more details.
它仍然会打印结果,但也会 return 结果,以便可以在变量中捕获它。魔术命令的语法有点受限,但您可以通过将其分配给变量并将该变量附加到列表来在 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
然后访问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>]
这些结果中的每一个都有几个可能感兴趣的属性:
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
例如,要绘制最佳时间,您需要创建一个包含最佳值的新列表:
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]
假设您可以 use/import 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
然后您可以 运行 非交互脚本:
ipython testme.py
使用细胞魔法%%
在:
%%timeit -o
res = []
for i in range(5):
a = 10*10
res.append(a)
输出:
526 ns ± 44.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
<TimeitResult : 526 ns ± 44.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)>
变量下划线'_'存储最后一个表达式值
在:
result = _
result
输出:
<TimeitResult : 526 ns ± 44.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)>
现在我们可以从属性中获取更多数据(help(result)
)
在:
print(result.average) # 2.358365715216288e-06
print(result.stdev) # 5.159462070683934e-07
print(result.timings) #[3.5457100011626608e-06, ..., 2.4937099988164847e-06]
print(result.all_runs) # [0.0003545710001162661, ... 0.00024937099988164846]
print(result.best) # 2.003900021442676e-06
print(result.compile_time) # 0.00030000000000995897
print(result.loops) # 100
print(result.repeat) # 7
print(result.worst) # 3.5457100011626608e-06