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

为此,我尝试了%%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中使用执行时间相当长一段时间了。这是伟大的。

更新2021 - 03

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


当前回答

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

安装包在笔记本的开始

pip install ipython-autotime

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

%load_ext autotime

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

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

%unload_ext autotime

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

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

其他回答

%time和%timeit现在成为ipython内置魔法命令的一部分

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

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执行最后一条语句。

不要忘记单元格魔术以%%开始,行魔术以%开始。

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

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

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

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

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

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

你可以使用timeit魔法函数。

%timeit CODE_LINE

或者在单元格上

%%timeit 

SOME_CELL_CODE

查看更多IPython魔法功能,请访问https://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb