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


181

除了单元的原始输出,我想花时间在单元执行上。

为此,我尝试了%%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

最好的方法是什么?

更新资料

我已经在Nbextension中使用Execute Time了一段时间了。这太棒了。


3
您真的需要定时显示值吗?为什么不将x显示行放在下一个单元格中?
dbliss

为什么不接受答案?
raratiru

Answers:


46

使用单元魔术和Phillip Cloud在github上的此项目:

通过将其放在笔记本顶部或如果您始终希望默认情况下将其放在配置文件中来进行加载:

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

如果加载,则后续单元执行的每个输出将包括执行时间(以分钟和秒为单位)。


15
由于%install_ext已被弃用,因此它不再起作用。有其他选择吗?
eyeApps LLC

13
有一个处理此问题的请求请求(github.com/cpcloud/ipython-autotime/pull/5),然后您可以尝试pip install ipython-autotime
x0s

13
现在%%time即使最后一条语句不是,也可以使用print
rhaps0dy

439

我发现克服此问题的唯一方法是执行带有print的最后一条语句。

不要忘了单元魔术始于,%%行魔术始于%

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

请注意,在下一个单元格中将不考虑在单元格内执行的任何更改,这在存在管道时是很直观的: 一个例子


4
现在,即使不打印最后一条语句,%% time也可以正常工作,如上文@ rhaps0dy所指出的。
nealmcb

1
display(res)也可以工作,并且是尝试显示pandas数据框或其他需要样式化输出的内容时的首选解决方案。
dshefman '18 -10-31

@dshefman是的,这是正确的,它也可以轻松地用于数据砖/火花笔记本。
technazi

当我们实现第一个单元%%timea=1第二个单元不知道a是什么时,这不是问题吗?
杰森

3
仅供参考。我发现被测试单元中的变量现在已被考虑到下一个单元中。(20/02/2020)-Fei
Fei Yao


43

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

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

5
这是最被低估的答案!
DaveR

1
对那些从答案海中跳出来的人:这是一个,只需安装它,然后您就会以一种很好的格式看到每个单元的执行时间
El pocho la pantera

14

我只是%%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

这是否执行单元代码的默认编号。时间,然后取平均值?那么第一条语句就是“设置代码”呢?
amsquareb

12
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)


9

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

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

7

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

%%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语句可以保留格式。 屏幕截图


这是否执行单元代码的默认编号。时间,然后取平均值?那么第一条语句就是“设置代码”呢?
amsquareb

2

您可能还需要查看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)

将返回

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}

当处理大量代码时,我发现它很有用。


2

遇到麻烦时,意味着什么:

?%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.

1

如果要打印壁单元执行时间,这是一个技巧,请使用

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

但是请确保%% time是一个魔术函数,因此请将其放在代码的第一行

如果您将其放在代码的某些行之后,则会出现用法错误,并且无法正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.