2017-04-09 49 views
1

看來,在Spyder的(IPython3內核),可以通過在代碼單元的頂部運行%%time%%timeit命令容易時間碼單元:測量運行時

#%% 
%%time # or %%timeit which measures average runtime from multiple runs 
.... 

#%% (the previous cell ends and the next begins) 

運行上面的代碼可以獲得由#%%對定義的單元的運行時間。這是Spyder中的工作原理,但在Jupyter Notebook環境中並不適用。

在Jupyter代碼中,單元格不是由#%%分隔符定義的,而是通過單擊菜單欄中的按鈕來創建的。而據我所知,命令%%time%%timeit都會引發編譯錯誤。似乎Jupyter無法識別它們,但這很奇怪,因爲我的Jupyter實際上使用與Spyder相同的IPython內核。有一件事是,在Jupyter的工作原理是%time%timeit的命令,但只能測量的一個行代碼運行時,即,必須制定類似

%time blah blah 

而且事實證明我甚至不能測量由多於一行組成的for循環。所以這種方法對我來說是不可取的。有沒有什麼方法可以在Jupyter中使用魔術命令%time(it)等來評估單元運行時?

(PS:如果在Spyder的我在池的頂部附加%time命令它會給Wall time: 0 ns因爲沒有在同一行下它和它的實際測量什麼)

+1

'%% time'和'%% timeit'是有效的IPython單元格魔術,eithet應該作爲筆記本單元格的第一行。你使用的是Jupyter和IPython的版本? – cco

+0

@cco Jupyter 4.3.1和IPython 4.2.1應該是最新的。 – Vim

+0

當您嘗試使用'%% time'時,請顯示單元格和錯誤信息 - 如果'%time'有效,'%% time'也應該如此。 – cco

回答

4

它取決於你想如何使用時間信息......

如果你只是想知道一個單元花了多長時間來執行你自己的知識,那麼ExecuteTime筆記本擴展(https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tree/7672d429957aaefe9f2e71b15e3b78ebb9ba96d1/src/jupyter_contrib_nbextensions/nbextensions/execute_time)是一個很好的解決方案,因爲它提供爲所有代碼單元自動提供時間信息,這意味着您不需要添加時間就可以減少代碼維護遍佈各地的代碼。它還會寫入上次執行的日期戳記,如果您將筆記本用作科學日誌,這是非常有用的。

但是,如果要以編程方式使用時間信息,則需要添加代碼以將時間信息捕獲到變量中。按照這個答案(Get time of execution of a block of code in Python 2.7),你可以使用timeit模塊:

import timeit 
start_time = timeit.default_timer() 
# code you want to evaluate 
elapsed = timeit.default_timer() - start_time 

顯然,這並不像使用魔法的細胞作爲整潔,但要完成這項工作。

至於如何使用細胞魔法來實現後者,我不知道。

+0

感謝您的建議。是的,我可以在每個單元格的最開始處使用%% timeit命令來實現後者。 – Vim