セルからの元の出力に加えて、セルの実行に費やされた時間を取得したいと思います。
この目的のために、私は%%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を使っています。それは素晴らしいです。
Phillip Cloudのgithubでセルマジックとこのプロジェクトを使用してください。
これをあなたのノートブックの一番上に置くことによってそれをロードするか、もしあなたがいつもデフォルトでそれをロードしたいならばあなたの設定ファイルの中にそれを置いてください:
%install_ext https://raw.github.com/cpcloud/ipython-autotime/master/autotime.py
%load_ext autotime
ロードされている場合、後続のセル実行のすべての出力には、実行に要した分と秒単位の時間が含まれます。
%time
と%timeit
はipythonの組み込み マジックコマンドの一部になりました
もっと簡単な方法はjupyter_contrib_nbextensionsパッケージのExecuteTimeプラグインを使うことです。
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable execute_time/ExecuteTime
私は単にセルの先頭に%%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
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)
これは正確ではありませんが、追加のソフトウェアなしで
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
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)
あなたはpythonのプロファイリングマジックコマンド%prun
whichを見てみたいと思うかもしれません -
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}
大量のコードを扱うときに便利です。
timeit
マジック関数を使うことができます。
%timeit CODE_LINE
またはセル上
%%timeit SOME_CELL_CODE
IPythonのマジック関数については、 https://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb を参照してください。
問題が発生した場合、何が何を意味するのか:
?%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.