IPython%timeit magic - 将输出从“mean& std”改为“best of 3”

时间:2018-02-11 16:11:56

标签: python eclipse python-3.x ipython timeit

我在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”是更好的衡量标准,所以我想改变我的输出。 我同时阅读了IPythonPython 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控制台中以交互方式运行的版本。

2 个答案:

答案 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 - 新的测试待定 - ”

https://github.com/ipython/ipython/commit/509d8539c555ede6222d13cf1693388429213853#diff-ee52fbe4422737ccaa3d6d0b15ea5189

但语法“最好的3”来自main()函数中的python timeit模块,这在python2和3中通常是相同的。