Pythonのtimeitモジュールで処理時間を計測

Pythonの標準ライブラリのtimeitモジュールを使うとコードの処理の実行時間を簡単に計測できます。手っ取り早く調べるのに便利です。

27.5. timeit — 小さなコード断片の実行時間計測 — Python 3.6.1 ドキュメント

ここでは以下の2つの場合について説明します。

Pythonファイル内で計測: timeit Jupyter Notebookで計測: %timeit, %%timeit

そのほか、time.time()を使ってプログラム中での経過時間を測定する方法もあります。

Pythonファイル内で計測: timeit

連続したn個の数値の合計値を算出するシンプルな関数test(n)の処理時間を測定します。

import timeit

def test(n):
    return sum(range(n))

n = 10000
loop = 1000

result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842

timeit.timeit()関数に測定したいコードを文字列で渡すとnumber回実行され、それにかかった時間が返されます。numberの初期値は100万。時間のかかる処理を初期値のまま行うとかなり時間がかかってしまうので気をつけてください。 引数globalsにglobals()を渡すことで、グローバルな名前空間でコードが実行されます。これがないと、上の例だと関数testや変数nが認識されません。 コードは呼び出し可能なオブジェクトでもいいので、引数なしのlambda式で指定しても問題ありません。この場合は引数globalsは指定しなくても大丈夫。

result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287

結果の単位は秒。実行回数で割って1回あたりの処理時間を出力しています。 割らないと実行回数を増やすと単純に結果の値も大きくなっていく。

print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038

timeit.repeat()関数を使うと、timeit()を繰り返し実行できます。結果はリストで得られます。

repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]

Jupyter Notebookで計測: %timeit, %%timeit

Jupyter Notebook(IPython)ではマジックコマンド%timeit, %%timeitが使えます。timeitモジュールをインポートする必要はない。

Built-in magic commands: %timeit — IPython 7.2.0 documentation

%timeit %timeitでは、コマンドライン引数のようにスペースで区切って対象のコードを指定します。 デフォルトだとtimeit.timeit()におけるnumberとrepeatは自動で決められます。nと-rオプションで指定することもできます。 結果は平均と標準偏差が算出されます。 %timeit test(n) 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -r 3 -n 10000 test(n) 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

%%timeit マジックコマンド%%timeitを使うとセル全体の処理時間を測定できます。 例として同じ処理をNumPyを使って実行してみます。nと-rオプションは省略できます。 セル全体の処理時間を計測するので、以下の例ではNumPyをimportする時間も含まれています。 %%timeit -r 3 -n 10000

import numpy as np
a = np.arange(n)
np.sum(a)

19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

%%timeitは対象コードを引数で指定したりする必要がない。セルの先頭に%%timeitと書いておくだけなので最も簡単に使用できます。

Last Updated: 6/26/2019, 10:34:03 PM