よしたく blog

ほぼ週刊で記事を書いています

Jupyter Notebookでコードの速度を計測するtimeとtimeit

Jupyte Notebook でコードの速度を計測する方法にマジックコマンドとして用意されている、timetimeitを使う方法がある。 この 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

結果の見方についてはこちら

yoshitaku-jp.hatenablog.com

%%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

まとめ

まとめると次のようになる。