Python %代码中的timeit等价物

Python %代码中的timeit等价物,python,timing,Python,Timing,magic命令%timeit非常适合以交互方式测量代码执行时间。但是,我想获得%timeit的结果,以便绘制结果timeit.timeit也允许这样做,但不具有迭代次数的自动缩放和结果的正常化功能,而%timeit具有这种功能 是否有一个内置函数可以为一段代码计时,该函数还可以自动调整执行的迭代次数,并返回标准化结果?magic命令提供了一个-o选项: -o:返回一个可存储在变量中的值,以更详细地检查结果 它仍然会打印结果,但也会返回结果,以便可以将其捕获到变量中。magic命令的语法有点有限,

magic命令
%timeit
非常适合以交互方式测量代码执行时间。但是,我想获得
%timeit
的结果,以便绘制结果
timeit.timeit
也允许这样做,但不具有迭代次数的自动缩放和结果的正常化功能,而
%timeit
具有这种功能

是否有一个内置函数可以为一段代码计时,该函数还可以自动调整执行的迭代次数,并返回标准化结果?

magic命令提供了一个
-o
选项:

-o:返回一个可存储在变量中的值,以更详细地检查结果

它仍然会打印结果,但也会返回结果,以便可以将其捕获到变量中。magic命令的语法有点有限,但您可以通过将其分配给变量并将该变量附加到列表中,在
列表中收集不同的结果:

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>]
例如,要绘制最佳时间,您需要创建一个包含最佳值的新列表:

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]

假设您可以使用/导入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
使用单元格魔法%%

在:

输出:

输出:


我认为没有,但是对于计时,你只需要创建一个计时器装饰器,迭代计数器并不像你想的那样容易工作虽然从用户角度来看可能不可用。我根据@MSeifert的建议使用magic上的-o标志来捕获输出。。。
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)>
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