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

我想得到的时间花在单元格执行除了原始的输出从单元格。

为此,我尝试了%%timeit -r1 -n1,但它不公开在cell中定义的变量。

%%time适用于只包含1条语句的cell。

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

最好的方法是什么?

更新

我已经使用在nbeextension中执行Time很长一段时间了。这是伟大的。

更新2021 - 03

到目前为止,是正确的答案。本质上,%%time%%timeit现在都像人们预期的那样工作。

451950 次浏览

%time%timeit现在是ipython内置神奇的命令的一部分

使用细胞魔法和这个项目在github由菲利普云:

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

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

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

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

别忘了单元格魔术从%%开始,行魔术从%开始。

%%time
clf = tree.DecisionTreeRegressor().fit(X_train, y_train)
res = clf.predict(X_test)
print(res)
注意,在单元格内执行的任何更改都不会在下一个单元格中被考虑,当有管道时,这是违反直觉的: an example < / p >

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

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语句可以保留格式。 截图 < / p >

我只是在单元格的开头添加了%%time,并得到了时间。您可以在Jupyter Spark集群/虚拟环境中使用相同的方法。只要在单元格的顶部添加%%time,你就会得到输出。在使用Jupyter的星火集群上,我添加到单元格的顶部,我得到如下输出

[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的剖析魔法命令__abc0,它给出了类似于-的东西

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
< p >然后

%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}

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

你可以使用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.
如果你想打印壁单元格的执行时间,这里有一个技巧, 使用< / p >
%%time
<--code goes here-->

但是这里要确保,% %的时间是一个神奇的函数, 所以把它放在代码的第一行。< / p >

如果你把它放在代码的某行之后它会给你

.使用错误,不能工作

这只是旧版本的一个问题。

你现在要做的就是把%%time放在单元格的顶部。

enter image description here

%%time测量运行某样东西所需的时间。它更适合报告长时间运行的操作,而不是进行低级优化。

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

enter image description here

%%timeit使用python的timeit模块。医生说,

它避免a 用于测量执行时间的常见陷阱的数量。另见蒂姆·彼得斯 Python食谱中“算法”一章的介绍,由 O ' reilly . < / p >

希望认为这个模块仍然是相关的,因为它所引用的引用描述了这样的问题:(1)Windows 98的解决方案是每秒只更新time.time() 18.2次,(2)将所有语句阻塞在一行上,以避免增加行号计数器的字节码开销。


目前排名第一的答案,以及其他一些过时的答案——它们应该被删除,因为它们现在是在很大程度上是一种误导 -——有有用的注释,表明这些答案是不正确的:

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

安装包在笔记本的开始

pip install ipython-autotime

然后通过下面运行加载扩展

%load_ext autotime

一旦加载了它,在此之后运行的任何单元格都将给出该单元格的执行时间。

不要担心,如果你想关闭它,只需卸载扩展运行下面

%unload_ext autotime

这是相当简单和容易使用它,只要你想。

如果你想了解更多,可以参考ipython-autime文档或它的github源