Jupyte Notebook でコードの速度を計測する方法にマジックコマンドとして用意されている、time
と timeit
を使う方法がある。
この 2 つの存在は知っていたが、
- time と timeit で何が違うのか
- %の数が 1 つのときと 2 つのときで何が違うのか
がわからなかったので、確認してみた!
%time と %%time
%time
%time
は 1 行毎の処理時間を 1 回計測する。
例で上げたコードは、ループの中で%time
を使っているので、出力結果には 10 回分の結果が表示されている。
dist = [] for i in range(10): %time dist.append(i ** 2)
CPU times: user 7 µs, sys: 1e+03 ns, total: 8 µs Wall time: 13.4 µs CPU times: user 7 µs, sys: 0 ns, total: 7 µs Wall time: 10.5 µs CPU times: user 5 µs, sys: 0 ns, total: 5 µs Wall time: 8.58 µs CPU times: user 6 µs, sys: 1 µs, total: 7 µs Wall time: 11.2 µs CPU times: user 6 µs, sys: 0 ns, total: 6 µs Wall time: 9.78 µs CPU times: user 5 µs, sys: 0 ns, total: 5 µs Wall time: 9.3 µs CPU times: user 5 µs, sys: 0 ns, total: 5 µs Wall time: 9.3 µs CPU times: user 4 µs, sys: 0 ns, total: 4 µs Wall time: 6.68 µs CPU times: user 3 µs, sys: 0 ns, total: 3 µs Wall time: 5.72 µs CPU times: user 4 µs, sys: 0 ns, total: 4 µs Wall time: 5.72 µs
結果の見方についてはこちら
%%time
次に%が 2 つになった%%time
の動きを確認する。%%time
は セルの処理時間を 1 回計測する。
%%time dist = [] for i in range(10): dist.append(i ** 2)
CPU times: user 14 µs, sys: 0 ns, total: 14 µs Wall time: 19.1 µs
%timeit と %%timeit
%timeit
%timeit
は 1 行毎の処理時間を 複数回計測し平均処理時間を表示する。
%timeit [x ** 2 for x in range(10000)] %timeit [x ** 2 for x in range(10000)] %timeit [x ** 2 for x in range(10000)]
100 loops, best of 5: 2.77 ms per loop 100 loops, best of 5: 2.74 ms per loop 100 loops, best of 5: 2.74 ms per loop
%%timeit
次に%が 2 つになった%%timeit
の動きを確認する。%%timeit
は セルの処理時間を 複数回計測し平均処理時間を表示する。
%%timeit [x ** 2 for x in range(10000)] [x ** 2 for x in range(10000)] [x ** 2 for x in range(10000)]
100 loops, best of 5: 8.39 ms per loop
実行回数の変更方法
timeit
はデフォルトで 100 回ループしてくれる。
この回数を変更するためには-n オプションで回数を指定する。
%%timeit -n 1000 [x ** 2 for x in range(10000)] [x ** 2 for x in range(10000)] [x ** 2 for x in range(10000)]
1000 loops, best of 5: 8.34 ms per loop
さらにr
で繰り返す回数も変更できる。
%%timeit -n 100 -r 10 [x ** 2 for x in range(10000)] [x ** 2 for x in range(10000)] [x ** 2 for x in range(10000)]
100 loops, best of 10: 8.25 ms per loop
まとめ
まとめると次のようになる。