在 ipython notebook 中测量单元格执行时间的简单方法

Simple way to measure cell execution time in ipython notebook

除了单元格的原始输出之外,我还想获得单元格执行所花费的时间。

为此,我尝试了 %%timeit -r1 -n1 但它没有公开单元格中定义的变量。

%%time 适用于仅包含 1 个语句的单元格。

In[1]: %%time
       1
CPU times: user 4 µs, sys: 0 ns, total: 4 µs
Wall time: 5.96 µs
Out[1]: 1

In[2]: %%time
       # Notice there is no out result in this case.
       x = 1
       x
CPU times: user 3 µs, sys: 0 ns, total: 3 µs
Wall time: 5.96 µs

最好的方法是什么?

更新

我使用 Execute Time in Nbextension 已经有一段时间了。太棒了。

更新 2021-03

截至目前, 是正确答案。本质上,%%time%%timeit 现在都可以正常工作。

%time%timeit 现在是 ipython 的内置 magic commands

的一部分

Phillip Cloud 在 github 上使用细胞魔法和这个项目:

通过将它放在笔记本的顶部来加载它,或者如果您总是希望默认加载它,则将它放在您的配置文件中:

%install_ext https://raw.github.com/cpcloud/ipython-autotime/master/autotime.py
%load_ext autotime

如果加载,后续单元执行的每个输出都将包括执行它所花费的时间(分钟和秒)。

我发现解决这个问题的唯一方法是使用 print 执行最后一条语句。

Do not forget that 单元魔术以 %% 开头,线魔术以 % 开头。

%%time
clf = tree.DecisionTreeRegressor().fit(X_train, y_train)
res = clf.predict(X_test)
print(res)

请注意,在单元格内执行的任何更改都不会在下一个单元格中考虑,这在有管道时是违反直觉的:

这不是很漂亮,但没有额外的软件

class timeit():
    from datetime import datetime
    def __enter__(self):
        self.tic = self.datetime.now()
    def __exit__(self, *args, **kwargs):
        print('runtime: {}'.format(self.datetime.now() - self.tic))

然后你可以运行它喜欢:

with timeit():
    # your code, e.g., 
    print(sum(range(int(1e7))))

% 49999995000000
% runtime: 0:00:00.338492

有时使用 print(res) 时,单元格中的格式会有所不同,但 jupyter/ipython 带有 display。请参阅下面使用 pandas 的格式差异示例。

%%time
import pandas as pd 
from IPython.display import display

df = pd.DataFrame({"col0":{"a":0,"b":0}
              ,"col1":{"a":1,"b":1}
              ,"col2":{"a":2,"b":2}
             })

#compare the following
print(df)
display(df)

display语句可以保留格式。

我简单的在单元格的开头加了%%time就得到了时间。您可以在使用相同的 Jupyter Spark 集群/虚拟环境中使用相同的。只需在单元格顶部添加 %%time 即可获得输出。在使用 Jupyter 的 spark 集群上,我添加到单元格的顶部,得到如下输出:-

[1]  %%time
     import pandas as pd
     from pyspark.ml import Pipeline
     from pyspark.ml.classification import LogisticRegression
     import numpy as np
     .... code ....

Output :-

CPU times: user 59.8 s, sys: 4.97 s, total: 1min 4s
Wall time: 1min 18s

更简单的方法是使用 jupyter_contrib_nbextensions 包中的 ExecuteTime 插件。

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable execute_time/ExecuteTime

您可能还想查看 python 的分析魔术命令 %prun,它给出了类似的东西 -

def sum_of_lists(N):
    total = 0
    for i in range(5):
        L = [j ^ (j >> i) for j in range(N)]
        total += sum(L)
    return total

然后

%prun sum_of_lists(1000000)

将return

14 function calls in 0.714 seconds  

Ordered by: internal time      

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    5    0.599    0.120    0.599    0.120 <ipython-input-19>:4(<listcomp>)
    5    0.064    0.013    0.064    0.013 {built-in method sum}
    1    0.036    0.036    0.699    0.699 <ipython-input-19>:1(sum_of_lists)
    1    0.014    0.014    0.714    0.714 <string>:1(<module>)
    1    0.000    0.000    0.714    0.714 {built-in method exec}

我发现它在处理大块代码时很有用。

您可以为此使用 timeit 魔术功能。

%timeit CODE_LINE

或者在单元格上

%%timeit 

SOME_CELL_CODE

https://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb

查看更多 IPython 魔术功能
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)

遇到麻烦时是什么意思:

?%timeit??timeit

获取详情:

Usage, in line mode:
  %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
or in cell mode:
  %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
  code
  code...

Time execution of a Python statement or expression using the timeit
module.  This function can be used both as a line and cell magic:

- In line mode you can time a single-line statement (though multiple
  ones can be chained with using semicolons).

- In cell mode, the statement in the first line is used as setup code
  (executed but not timed) and the body of the cell is timed.  The cell
  body has access to any variables created in the setup code.

如果你想在这里打印墙单元执行时间是一个技巧, 使用

%%time
<--code goes here-->

但这里要确保 %%time 是一个魔法函数, 所以把它放在代码的第一行

如果你把它放在代码的某行之后,它会给你 使用错误,无法正常工作。

这只是旧版本中的问题。

您现在需要做的就是将 %%time 放在单元格的顶部。

%time 测量运行 花费了多长时间。报告 long-运行ning 操作比进行低级优化更好。

%%timeit 是一个基准测试工具,运行s 语句一遍又一遍地为某些语句提供 平均 运行 时间,如以及标准偏差。由于重复执行语句的方式,在 %%timeit 个单元格中创建的变量在其他单元格中不可用。

%%timeit uses the python timeit 模块。该文件说,

It avoids a number of common traps for measuring execution times. See also Tim Peters’ introduction to the “Algorithms” chapter in the Python Cookbook, published by O’Reilly.

希望 该模块仍然相关,因为 the reference it refers to 描述了诸如 (1) Windows 98 的解决方法仅更新 [=16] =] 每秒 18.2 次,并且 (2) 将所有语句塞到一行中以避免增加行号计数器的字节码开销。


,以及其他一些过时的——应该删除,因为它们现在具有高度误导性 有有用的评论表明这些答案不正确:

在 ipython notebook 中测量单元格执行时间的最简单方法是使用 ipython-autotime 包。

在笔记本开头安装包

pip install ipython-autotime

然后通过下面的 运行ning 加载扩展程序

%load_ext autotime

加载后,此后的任何单元格 运行 都会为您提供该单元格的执行时间。

如果您想关闭它,请不要担心,只需通过下面的 运行ning

卸载扩展程序
%unload_ext autotime

使用起来非常简单易用。

如果想了解更多,可以参考ipython-autime documentation or its github source