EnsekiTT Blog

EnsekiTTが書くブログです。

Jupyter Notebookでセルの実行時間をはかるなら%%timeを使おうって話

つまりなにしたの?
まだ

start = time.time()
# 計測したい処理
e_time = time.time() - start
print ("e_time:{0}".format(e_time) + "[s]")

で消耗してるの?ってことでずっと消耗してたのでJupyter(Ipython)らしい方法を使うようにした話。
f:id:ensekitt:20171117233004j:plain


*1

Pythonでコードの一部の実行時間をはかる時のいつもの方法

Timeをインポートして現在時刻と処理開始時刻の差をとってた。

import time

start = time.time()

[x ** 2 for x in range(100000)] # 計測したい処理

e_time = time.time() - start
print ("e_time:{0}".format(e_time) + "[s]")

Jupyter Notebookで使える%timeと%timeit

JupyterというかIPythonには%timeと%timeitがあってそれぞれ

  • %time

%time 時間計測をしたい処理 
と記述することで、その処理の実行時間を計測・表示してくれる。

  • %timeit

%timeit 時間計測をしたい処理
と記述することで、その処理を自動的に何度か実行して時間を計測してくれる(ばらつきがあるときなどに使う。

%time l = [x ** 2 for x in range(100000)]
%timeit l = [x ** 2 for x in range(100000)]

CPU times: user 52.1 ms, sys: 3.71 ms, total: 55.9 ms
Wall time: 60.7 ms
34.6 ms ± 1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

え、セルごとじゃないの?

1行の実行時間をはかるというのはJupyter Notebookでもやることはあるけど、
やっぱり知りたいのはセルの実行時間。構造化する前のコードとかが多いからなおさら。
安心してください、セルでも出来ますよ。

%%time
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]

CPU times: user 232 ms, sys: 8.14 ms, total: 240 ms
Wall time: 248 ms
%%timeit
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]
l = [x ** 2 for x in range(100000)]

225 ms ± 17.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

表示されるのは%一つのときと同じだけど対象がセルになってる。
%%time,%%timeitはセルの最初に書かないとエラーが出るので注意

もっと早く調べて使えばよかった

実行例はこちら
github.com