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

时间:2015-09-14 13:15:57

标签: python ipython ipython-notebook jupyter

除了来自单元格的原始输出之外,我还想花费在单元格执行上花费的时间。

为此,我尝试了%%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很长一段时间了。太棒了。

14 个答案:

答案 0 :(得分:309)

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

Do not forget that单元格法术以tid开头,行法术以%%开头。

%

答案 1 :(得分:46)

%time%timeit现在已成为ipython的内置magic commands

的一部分

答案 2 :(得分:28)

Phillip Cloud在github上使用cell magic和这个项目:

将它放在笔记本的顶部加载它,或者如果你想在默认情况下加载它,请将它放在配置文件中:

1

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

答案 3 :(得分:13)

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

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

答案 4 :(得分:11)

我只是在单元格的开头添加了%%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

答案 5 :(得分:9)

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

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

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

如果将其放在代码的某些行之后,它将为您提供 使用错误,将无法正常工作。

答案 6 :(得分:8)

这只是旧版本的问题。

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

enter image description here

%time 衡量某件事运行所需的时间。报告长期运行的操作比进行低级优化更好。

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

enter image description here

%%timeit 使用 python timeit 模块。文档说,

<块引用>

它避免了 用于测量执行时间的常见陷阱的数量。另见蒂姆·彼得斯 Python Cookbook 中“算法”一章的介绍,由 奥莱利。

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


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

答案 7 :(得分:7)

有时使用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语句可以保留格式。 screenshot

答案 8 :(得分:6)

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

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

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

%timeit CODE_LINE

或者在单元格上

%%timeit SOME_CELL_CODE

https://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb处查看更多IPython魔术函数

答案 11 :(得分:1)

遇到麻烦意味着什么:

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

在notebook开头安装包

pip install ipython-autotime

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

%load_ext autotime

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

如果您想关闭它,请不要担心,只需在下面运行即可卸载扩展程序

%unload_ext autotime

它非常简单,随时可以使用。

如果你想查看更多,可以参考ipython-autime documentation或其github source