Python – コードの実行時間を計測する方法

目次

概要

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)

コメント

コメントする

目次