测量Jupyter Notebook代码单元的运行时

Vim*_*Vim 4 python time ipython spyder jupyter-notebook

似乎在Spyder(IPython3 Kernel)中,可以通过在代码单元顶部运行%%timeor %%timeit命令来轻松计时代码单元:

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

#%% (the previous cell ends and the next begins)
Run Code Online (Sandbox Code Playgroud)

运行上面的代码可以获得由这对代码定义的单元格的运行时间#%%.这就是Spyder中的工作方式,但在Jupyter Notebook环境中并不常用.

在Jupyter中,代码单元格不是由#%%分隔符定义的,而是通过单击菜单栏中的按钮来创建.而据我试过了,命令%%time%%timeit既能提高编译错误.似乎Jupyter无法识别它们,但它很奇怪,因为我的Jupyter实际上使用了与Spyder相同的IPython内核.在Jupyter中有效的一点是%time%timeit命令,但它们只能测量一行代码的运行时间,即必须像

%time blah blah
Run Code Online (Sandbox Code Playgroud)

事实证明,我甚至无法测量for由多条线组成的循环.所以这种方法对我来说并不合适.是否有任何方法可以使用%time(it)Jupyter中的magic命令等来评估单元运行时?

(PS:如果在Spyder中我%time在一个单元格的顶部附加一个命令,它会给出,Wall time: 0 ns因为在同一行中没有任何跟随它的东西,它实际上没有测量任何东西.)

小智 24

请放在%%time单元格的最开始,甚至在任何评论之前。这对我有用。


Big*_*gsy 8

这取决于你想如何使用时间信息......

如果你只是想知道一个单元花了多长时间来执行你自己的知识,那么ExecuteTime笔记本扩展(https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tree/7672d429957aaefe9f2e71b15e3b78ebb9ba96d1/src/jupyter_contrib_nbextensions/nbextensions/execute_time)是一个很好的解决方案,因为它自动为所有代码单元提供时间信息,这意味着减少代码维护,因为您不必在整个地方添加时序代码.它还会写入最后执行的日期戳,如果您将笔记本用作科学日志,则该日期戳很有用.

但是,如果要以编程方式使用时间信息,则需要添加代码以将时间信息捕获到变量中.根据这个答案(在Python 2.7中获取执行代码块的时间),您可以使用timeit模块:

import timeit
start_time = timeit.default_timer()
# code you want to evaluate
elapsed = timeit.default_timer() - start_time
Run Code Online (Sandbox Code Playgroud)

显然,这不像使用细胞魔法那样整洁,但应该完成工作.

至于如何使用细胞魔法来实现后者,我不知道.

  • 谢谢你的建议。是的,我可以在每个单元格的开头使用%% timeit命令来实现后者。 (3认同)

use*_*737 6

对于基本计时功能,请%%time在单元格开头使用单元格魔法。

\n

%%timeit通过重复测量可以进行一些更有意义的计时实验。您可以使用默认选项或定义自己的选项,例如这里的三个运行,每个运行 100 个循环:

\n
%%timeit -n100 -r3\nimport math; n = 2       # the first line is the setup and doesn\'t get timed \nmath.sqrt(n)\n\n# Out:\n# 255 ns \xc2\xb1 20.7 ns per loop (mean \xc2\xb1 std. dev. of 3 runs, 100 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • -n<N>:循环执行给定的语句次数。如果未提供,则进行确定以获得足够的精度。

    \n
  • \n
  • -r<R>:重复次数,每次由循环组成,取最好的结果。默认值:7

    \n
  • \n
\n

%%time%%timeit可以用作行魔术(带有一个%)来对单行代码进行计时。

\n