2017-04-09 51 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