测量 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 运行一条一条命令
- pip 安装jupyter_contrib_nbextensions
- jupyter contrib nbextension 安装 --user
- jupyter nbextension 启用 spellchecker/main
- 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(有一个 %
)来计时单行代码.
似乎在 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 运行一条一条命令
- pip 安装jupyter_contrib_nbextensions
- jupyter contrib nbextension 安装 --user
- jupyter nbextension 启用 spellchecker/main
- 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(有一个 %
)来计时单行代码.