スキップしてメイン コンテンツに移動

Python: timeitモジュールを使ってお手軽に実行時間計測

Pythonではtimeitモジュールを使って簡単に実行時間を計測できる。以下に示すコードはPythonでは一般的なコードだと思う。たらい回し関数(竹内関数)と階乗を求める関数だ。これを実行した時の時間計測、さらにコードに含まれている関数の実行時間を簡単に測るにはどうすればよいか。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def tarai(x, y, z):
return tarai(tarai(x - 1, y, z),
tarai(y - 1, z, x),
tarai(z - 1, x, y)) if x > y else y
def factorial(n):
return n == 0 and 1 or reduce(lambda x, y: x * y, range(1, n + 1))
def main():
print tarai(12, 6, 0) # Tarai(12, 6, 0)
print factorial(10) # 10!
if __name__ == "__main__": main()
view raw test_timeit.py hosted with ❤ by GitHub

ここでtimeitモジュールが利用できる。まず、Pythonシェル環境では以下の通り。

main関数の測定は次のように行う。stmtで時間計測したい関数を指定して、setupで最初の1回だけ実行する文を指定する。numberは実行する回数となっている。正確を期するなら複数回を指定するべきだろう。

>>> import timeit >>> timeit.timeit(stmt='test_timeit.main()', setup='import test_timeit', number=1) 12 3628800 2.663659573618423

たらい回し関数(tarai)のみの測定。

>>> timeit.timeit(stmt='test_timeit.tarai(12, 6, 0)', setup='import test_timeit', number=1) 2.6390463109480637

階乗関数(factorial)のみの測定。100万回実行。

>>> timeit.timeit(stmt='test_timeit.factorial(10)', setup='import test_timeit', number=1000000) 2.3606330638673825

さらに、コマンドラインでの計測も可能だ。

main関数の測定。コマンドオプションの-sは最初に1回だけ実行する文、-nは実行する文の回数、-rはタイマのリピート数になっている。

$ python -m timeit -n 1 -r 1 -s "import test_timeit" "test_timeit.main()" 12 3628800 1 loops, best of 1: 2.63 sec per loop

たらい回し関数(tarai)のみの測定。

$ python -m timeit -n 1 -r 1 -s "import test_timeit" "test_timeit.tarai(12, 6, 0)" 1 loops, best of 1: 2.63 sec per loop

階乗関数(factorial)のみの測定。100万回実行。

$ python -m timeit -n 1000000 -r 1 -s "import test_timeit" "test_timeit.factorial(10)" 1000000 loops, best of 1: 2.33 usec per loop

ところで、上に示した階乗関数については「車輪の再発明」なので、通常はmath.factorialを使った方が良いだろう。

コメント