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

Measure runtime of a Jupyter Notebook code cell

似乎在 Spyder(IPython3 内核)中可以通过 运行 代码顶部的 %%time%%timeit 命令轻松地为代码单元计时单元格:

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

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

运行 上面的代码可以得到#%%对定义的cell的runtime。这就是 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,因为它后面没有任何内容 在同一行,它实际上没有测量任何东西。)

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

如果您只是想知道一个单元格执行了多长时间以了解您自己的知识,那么 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

显然,这不如使用细胞魔法那么巧妙,但应该可以完成工作。

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

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

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

自动单元格执行时间

打开cmd 运行一条一条命令

  1. pip 安装jupyter_contrib_nbextensions
  2. jupyter contrib nbextension 安装 --user
  3. jupyter nbextension 启用 spellchecker/main
  4. jupyter nbextension 启用 codefolding/main

除了 Jai Mahesh 的回答:在我的 Linux Mint 系统中,在 4 个命令之后,我需要手动启用执行时间以查看测量的执行时间。为此,我安装了配置器: https://github.com/Jupyter-contrib/jupyter_nbextensions_configurator

然后 运行 Jupyter Notebook 并使用浏览器进入配置器(通常是 http://localhost:8888/nbextensions)并手动启用 'Execute time'。

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

Put %%time at the very start of the cell even before any comments.

第二个选项是使用:timeit 库,我发现它的文本很重(个人意见)。

对于基本的计时功能,请在单元格的开头使用 %%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>:循环执行给定的语句次数。如果未提供,则确定以获得足够的准确性。

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

%%time%%timeit 也可以用作 line magics(有一个 %)来计时单行代码.