我在Ubuntu上使用与Eclipse / PyDev的IPython 6.2.1集成。 Python版本是3.5.2 我经常看到人们计时像
这样的剧本>>>%timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop
当我执行相同的操作时,我的输出是
>>>%timeit for _ in range(1000): True
20.8 µs ± 353 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Imho,“最好的3”是更好的衡量标准,所以我想改变我的输出。
我同时阅读了IPython和Python timeit文档。他们都没有提到,输出可能与“3的最佳”不同。这是Linux / Eclipse / PyDev实现的问题还是有办法改变timeit
模块的输出?
P.S。:当我使用timeit
时,在Eclipse控制台中也会发生同样的情况,因此IPython可能与此无关。
>>>timeit '"-".join(str(n) for n in range(100))'
11 ns ± 0.0667 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
Unutbu指出,您可以在程序中实现所需的行为。运行first script calling timeit.main()
here确实会返回3中的最佳值。但我更喜欢可以在Eclipse控制台中以交互方式运行的版本。
答案 0 :(得分:2)
显示由TimeitResult
对象生成(请参阅timeit??
代码列表)。使用-o选项,我得到了我可以检查的对象:
In [95]: %timeit -o np.einsum('bdc,ac->ab', a, b, optimize=False)
170 µs ± 27.5 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Out[95]: <TimeitResult : 170 µs ± 27.5 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)>
In [96]: res = _
In [97]: print(res)
170 µs ± 27.5 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [98]: vars(res)
Out[98]:
{'_precision': 3,
'all_runs': [1.6981208299985155,
1.6976570829865523,
1.6978941220149864,
1.6976559630129486,
1.6976608499826398,
1.697147795028286,
1.6977746890042908],
'best': 0.0001697147795028286,
'compile_time': 0.0,
'loops': 10000,
'repeat': 7,
'timings': [0.00016981208299985155,
0.00016976570829865524,
0.00016978941220149863,
0.00016976559630129485,
0.00016976608499826398,
0.0001697147795028286,
0.0001697774689004291],
'worst': 0.00016981208299985155}
看起来生成best of 3
显示的信息仍然存在,但格式化程序已经消失。它可能在旧版本中找到。
@property
def average(self):
return math.fsum(self.timings) / len(self.timings)
代码位于IPython/core/magics/execution.py
答案 1 :(得分:1)
此语法std / mean / dev于2016年10月5日添加到IPython。有关此改进,请参阅问题#9984 https://github.com/ipython/ipython/pull/9984。实施在这里:
“为%timeit magic添加了均值+ stdv - 新的测试待定 - ”
但语法“最好的3”来自main()函数中的python timeit模块,这在python2和3中通常是相同的。