目次
概要
Python の time
モジュールは Jupyter Notebook のマジックコマンドで、コードの実行時間を計測する方法について紹介します。
time モジュール
計測したい範囲の前後で time.time()
を実行し、その差分をとることで計測します。
In [1]:
import time
start = time.time()
sum(range(50000000))
elapsed = time.time() - start
print(f"{elapsed:.3f}s") # 秒
print(f"{elapsed * 1000:.0f}ms") # ミリ秒
print(f"{elapsed * 1000000:.0f}μs") # ナノ秒
0.796s 796ms 796409μs
with コンテキストで計測が行えるサンプルを紹介します。
In [2]:
import time
from contextlib import contextmanager
@contextmanager
def timeit(name):
start = time.time()
yield
elapsed = time.time() - start
print(f"{name}: {elapsed}s")
with timeit("sum"):
sum(range(50000000))
sum: 0.7450883388519287s
Jupyter Notebook のマジックコマンド
%%time – セルの実行時間
%%time
をセルの先頭に入れると、そのセルの処理を1回実行し、実行時間を計測します。
In [3]:
%%time
s = 0
for i in range(100):
s += i
CPU times: user 14 µs, sys: 0 ns, total: 14 µs Wall time: 17.4 µs
全体の実行時間を知るには Wall time
を見ればよいです。
- CPU times: CPU時間
- user: ユーザースペースで CPU が利用された時間
- sys: カーネルスペースで CPU が利用された時間
- total: CPU が利用された時間の合計 (total = user + sys)
- Wall time: 全体の実行時間
%time – 行の実行時間
%time
を行の先頭に入れると、その行の処理の実行時間を計測します。
In [4]:
for i in range(5):
%time sum(range(100))
CPU times: user 4 µs, sys: 0 ns, total: 4 µs Wall time: 5.72 µs CPU times: user 4 µs, sys: 0 ns, total: 4 µs Wall time: 5.96 µs CPU times: user 3 µs, sys: 1e+03 ns, total: 4 µs Wall time: 5.48 µs CPU times: user 4 µs, sys: 0 ns, total: 4 µs Wall time: 5.48 µs CPU times: user 3 µs, sys: 0 ns, total: 3 µs Wall time: 5.72 µs
%%timeit – セルの実行時間
%%timeit
を先頭に入れると、そのセルの処理を複数回実行して、実行時間を計測します。
In [5]:
%%timeit
s = 0
for i in range(100):
s += i
6.64 µs ± 3.55 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
上記の見方ですが、100000 ループ * 7回を実行した結果の平均が 6.87us、標準偏差が 257ns と解釈します。
マジックコマンドでは以下の引数を設定できます。
%%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code code code...
-r<R>
: ループ回数 (デフォルト: 3)-t
: time.time() を wall time の計測に使用します。(Unix のデフォルト)-c
: time.clock() を wall time の計測に使用します。(Windows のデフォルト)-p<P>
: 時間を表示する際の有効数字 (デフォルト: 3)-q
: 計測結果を出力しない
In [6]:
%%timeit -r3 -p2 # 3回ループ、有効数字2桁
s = 0
for i in range(100):
s += i
6.7 µs ± 2.8 ns per loop (mean ± std. dev. of 3 runs, 100000 loops each)
%timeit – 行の実行時間
%timeit
を行の先頭に入れると、その行の処理を複数回実行して、実行時間を計測します。
In [7]:
for i in range(5):
%timeit sum(range(100))
882 ns ± 0.867 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 874 ns ± 0.202 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 876 ns ± 0.363 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 876 ns ± 0.486 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 875 ns ± 0.686 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
コメント