Pythonではtimeitモジュールを使って簡単に実行時間を計測できる。以下に示すコードはPythonでは一般的なコードだと思う。たらい回し関数(竹内関数)と階乗を求める関数だ。これを実行した時の時間計測、さらにコードに含まれている関数の実行時間を簡単に測るにはどうすればよいか。
ここで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を使った方が良いだろう。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
ここで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を使った方が良いだろう。
コメント