2017-09-04 232 views
-1

我想時間一個python 3.6。程序從jupyter筆記本,但它看起來像魔術命令%timeit增加了很多額外的開銷,給我錯誤的統計。Jupyter筆記本%timeit比命令行慢1000倍,爲什麼?

從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 notebook的timeit可以給出正確的測量結果?

+2

84.1 **納秒**不比0.0163微秒慢1百萬倍。 84.1納秒是0.0841微秒,所以差異是5倍。 –

回答

1

您沒有正確讀取這些數字。 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筆記本,同樣具有相同的virtualenv;這基本上是驅動IPython中,從而預期沒有真正的區別是:

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

因此多數民衆贊成11.9 VS 12.1 VS 11.8納秒;太接近了不起作用。

+0

您是否注意到OPs中的一個timeit是迭代次數的10倍,會對其產生影響 –

+1

@NickA:迭代次數不會影響計時每次迭代。它*表示可能使用了不同的二進制。 –

+0

@Martijn你是對的規模,我的壞。 5的因素仍然很多,我想知道問題是什麼。您無法重現我的發現的原因可能是因爲您使用的是IPython而不是Jupyter筆記本。當我使用IPython時,速度幾乎沒有區別。 – user681814