Jupyter notebook %timeit 比命令行慢 1000 倍,为什么?

Jupyter notebook %timeit 1000 times slower than command line, why?

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

来自 Jupyter 笔记本:

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

来自命令行

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

所以在这种情况下,命令行 timeit 的运行速度比 jupyter notebook timeit 快数百万倍。这是什么原因,有没有办法解决这个问题,以便 timeitfrom jupyter notebook 可以给出正确的测量值?

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

1微秒是1000纳秒;归一化为纳秒 Python 报告为 16.3 纳秒,因此速度仅为原来的 5 倍。

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

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 notebook 中,再次使用相同的 virtualenv;这本质上驱动 ipython,所以正如预期的那样,没有真正的区别:

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

那就是 11.9 vs 12.1 vs 11.8 纳秒;太接近了,无法区分。