ipythonノートブックでセル実行時間を測定する簡単な方法


182

セルからの元の出力に加えて、セルの実行に費やされた時間を取得したいと思います。

このために、私は試しました%%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実行時間を使用しています。それは素晴らしいです。


3
値の表示に時間を合わせる必要がありますか?なぜx表示行を次のセルに入れないのですか?
dbliss 2016

答えを受け入れないのはなぜですか?
raratiru 2017年

回答:


46

セルマジックとこのプロジェクトをPhillip Cloudによるgithubで使用します。

これをノートブックの一番上に置いてロードするか、デフォルトで常にロードしたい場合は設定ファイルに入れます。

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

ロードされている場合、以降のセル実行のすべての出力には、実行にかかった分と秒の時間が含まれます。


15
%install_extは非推奨であるため、これは機能しなくなりました。代わりはありますか?
eyeApps LLC 2017

13
この問題に対処するプルリクエストがあります(github.com/cpcloud/ipython-autotime/pull/5)。次に試すことができますpip install ipython-autotime
x0s

13
さて%%time、最後の文がない場合でも動作しますprint
rhaps0dy 2017

443

この問題を解決する唯一の方法は、最後のステートメントをprintで実行することです。

セルマジックはで始まり%%、ラインマジックはで始まることを忘れないでください%

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

セル内で実行された変更は、次のセルでは考慮されないことに注意してください。これは、パイプラインがあると直観に反するものです。 例


5
@ rhaps0dyが上記で指摘したように、%% timeは最後のステートメントが出力されない場合でも機能するようになりました。
nealmcb

1
display(res)も機能し、スタイル化された出力を必要とするパンダデータフレームまたは何か他のものを表示しようとするときに推奨されるソリューションです。
dshefman 2018年

@dshefmanはい、それは正しいことであり、databricks / sparkノートブックでも簡単に移植できます。
テクナジ

それは我々が第一セルを実装する問題ではありません%%timea=1なく、第二の細胞は何を知っていないaのですか?
Jason

3
ご参考までに。テストしたセルの変数が次のセルに考慮されるようになりました。(2020年
飛矢尾


44

より簡単な方法は、jupyter_contrib_nbextensionsパッケージでExecuteTimeプラグインを使用することです。

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

6
これは最も過小評価されている答えです!
DaveR

2
答えの海を飛び越えて誰かに:これは1つです。それをインストールするだけで、各セルの実行時間が
適切

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

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

1
完璧です。%% timeitのオブジェクトを保存して次のセルで使用するのは面倒です
Paul


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は魔法の関数であるため、コードの最初の行に配置してください

コードのいくつかの行の後に配置すると、使用方法のエラーが発生し、機能しなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.