Jupyter笔记本%timeit比命令行慢1000倍,为什么?

时间:2017-09-04 07:13:13

标签: python jupyter-notebook timeit

我正在尝试使用python 3.6。来自jupyter笔记本的程序,但似乎魔术命令%timeit增加了很多额外的开销,给我错误的统计数据。

来自Jupyter笔记本:

%timeit a=1
10000000 loops, best of 3: 84.1 ns per loop

来自cmdline

python -m timeit 'a=1'
100000000 loops, best of 3: 0.0163 usec per loop

因此,在这种情况下,命令行timeit的运行速度比jupyter笔记本timeit快数百万倍。这是什么原因,有没有办法解决它,以便jupyter笔记本中的timeit可以给出正确的测量值?

1 个答案:

答案 0 :(得分:2)

您没有正确阅读这些数字。 IPython报告时间为纳秒(请注意ns缩写)。 Python正在以微秒usec)报告时间。

1微秒是1000纳秒;归一化为纳秒,Python报告为16.3纳秒,因此速度只有5倍。

但是,我无法重现您的发现。在virtualenv中使用相同的Python二进制文件来运行IPython并直接运行:

venv-3.6 $ bin/ipython
Python 3.6.2 (default, Jul 18 2017, 14:26:50)
Type "copyright", "credits" or "license" for more information.

IPython 5.2.2 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: %timeit a=1
100000000 loops, best of 3: 11.9 ns per loop

In [2]:
Do you really want to exit ([y]/n)? y

venv-3.6 $ bin/python -m timeit 'a=1'
100000000 loops, best of 3: 0.0121 usec per loop

并且在Jupyter笔记本中,再次使用相同的virtualenv;这实际上驱动了ipython,所以没有真正的区别:

%timeit a=1
100000000 loops, best of 3: 11.8 ns per loop

那是11.9 vs 12.1 vs 11.8纳秒;太近了,不能称之为差异。