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

Python Jupyter笔记本%timeit比命令行慢1000倍,为什么?,python,jupyter-notebook,timeit,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的运行速度比ju

我正在尝试计时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
可以提供正确的测量值?

您没有正确读取这些数字。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对12.1对11.8纳秒;距离太近,无法显示差异。

您没有正确读取这些数字。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对12.1对11.8纳秒;太接近了,不能称之为差异。

84.1纳秒比0.0163微秒慢100万倍。84.1纳秒是0.0841微秒,因此差是5.84.1纳秒的一个因数,但不比0.0163微秒慢100万倍。84.1纳秒是0.0841微秒,因此差异是5的一个因素。您是否注意到OPs
timeit
s中的一个迭代次数是10倍,这会影响吗it@NickA:迭代次数不会影响每次迭代的计时。这表明可能使用了不同的二进制。@Martijn你说得对,我的错。系数5仍然很大,我想知道问题是什么。你不能复制我的发现的原因可能是因为你使用的是IPython而不是Jupyter笔记本。当我使用IPython时,速度几乎没有差别。@user681814:我刚在Jupyter笔记本上试用过,但仍然得到了
100000000个循环,每个循环最好3:11.8ns
@user681814:我使用了IPython,因为这确实是Jupyter驱动的速度。你注意到OPs
timeit
s中的一个循环的迭代次数是10倍吗,这会影响吗it@NickA:迭代次数不会影响每次迭代的计时。这表明可能使用了不同的二进制。@Martijn你说得对,我的错。系数5仍然很大,我想知道问题是什么。你不能复制我的发现的原因可能是因为你使用的是IPython而不是Jupyter笔记本。当我使用IPython时,速度几乎没有差别。@user681814:我刚在Jupyter笔记本上试用过,但仍然得到了
100000000个循环,每个循环最好3:11.8 ns
@user681814:我使用了IPython,因为Jupyter实际上就是这样驱动的。