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

17

在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实际上使用与Spyder相同的IPython内核。在Jupyter中有效的一件事是%time%timeit命令,但它们只能测量一行代码的运行时间,即必须如下格式:
%time blah blah

结果发现我甚至无法测量由多行组成的 for 循环。所以这种方法对我来说不理想。在Jupyter中有没有仅使用魔术命令 %time(it) 等方式评估单元格运行时间的方法?

(PS:如果像在Spyder中一样,在单元格顶部附加一个 %time 命令,它将显示 Wall time: 0 ns 因为该命令在同一行中没有后续内容,实际上它没有执行任何计时)


8
%%time%%timeit 是有效的 IPython 单元格魔术命令,它们应该作为笔记本单元格的第一行。你正在使用哪个版本的 Jupyter 和 IPython? - cco
@cco Jupyter 4.3.1和IPython 4.2.1,应该是最新的版本。 - Vim
请展示当您尝试使用%%time时所得到的单元格和错误信息 - 如果%time有效,那么%%time也应该有效。 - cco
1
@cco 我知道出了什么问题。我以为注释不算,所以我把命令附加在一个头部命令下面了。 - Vim
6个回答

40

请在单元格的开头甚至在任何注释之前放置%%time。这对我有用。


18

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

如果您只是想知道一个单元格执行需要多长时间,那么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

显然,这不如使用单元格魔法那样简洁,但应该能完成任务。

至于如何/是否可以使用单元格魔法实现后者,我不知道。


3
谢谢您的建议。是的,我可以通过在每个单元格的开头使用%%timeit命令来实现后者。 - Vim

5

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

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

%%timeit -n100 -r3
import math; n = 2       # the first line is the setup and doesn't get timed 
math.sqrt(n)

# Out:
# 255 ns ± 20.7 ns per loop (mean ± std. dev. of 3 runs, 100 loops each)
  • -n<N>: 循环执行给定的语句 次数。如果未提供 N,则将确定其以获得足够的准确性。

  • -r<R>: 执行 次由循环组成的重复,并取最佳结果。默认值:7

%%time%%timeit 都可以作为单行魔术命令(使用一个 %)用于计时单行代码。


4

为避免在每个单元格中再次使用%%

自动执行单元格时间

打开cmd单独运行命令

  1. pip install jupyter_contrib_nbextensions
  2. jupyter contrib nbextension install --user
  3. jupyter nbextension enable spellchecker/main
  4. jupyter nbextension enable codefolding/main

没有起作用,我按照相同的步骤操作了。 - Dev_Man

1

像Rizwan的答案一样,我发现这是最简单的方法:

在任何注释之前甚至在单元格的开头放置%%time。

第二个选项是使用:timeit库,但我认为它过于文本密集(个人意见)。

enter image description here


0
除了Jai Mahesh的回答之外:在我的Linux Mint系统中,经过4个命令后,我需要手动启用执行时间才能看到测量的执行时间。为此,我安装了配置器: https://github.com/Jupyter-contrib/jupyter_nbextensions_configurator 然后运行Jupyter Notebook,并使用浏览器进入配置器(通常为http://localhost:8888/nbextensions),手动启用“Execute time”。 View in the extension configurator with enabled extension 'Execute Time'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接