ひきメモ

2007-12-25

[]コードの実行時間を計測する

コードの実行時間を計測するにはtimeitモジュールを使います。

from timeit import Timer

t1 = Timer("for i in range(1000): n += 1", "n = 0")
t2 = Timer("for i in xrange(1000): n += 1", "n = 0")

print t1.timeit(10000)
print t2.timeit(10000)
17.1534437386
15.0097889673

まず、Timerクラスのコンストラクタ引数には、計測の対象となるメイン文とメイン文を実行する前に一度だけ実行されるセットアップ文を指定します。

timeit( )は引数で指定した回数だけメイン文を実行し、かかった時間を浮動小数で返します。デフォルトの繰り返し回数は100万回なので、時間がかかりすぎる場合は繰り返し回数を減らすといいです。


repeat( )はtimeit( )を複数回呼び出し、その結果をリストにして返します。第一引数にはtimeit( )を呼び出す回数、第二引数にはtimeit( )に渡す引数を指定します。

from timeit import Timer

range_stmt = """
n = 0
for i in range(1000):
    n +=1
"""
xrange_stmt = """
n = 0
for i in xrange(1000):
    n += 1
"""

print Timer(range_stmt).repeat(3, 10000)
print Timer(xrange_stmt).repeat(3, 10000)
[16.55977555775323, 16.488735982835784, 16.483274107846263]
[15.00152701185069, 15.27352704537455, 14.916882616202074]

関数の実行時間を計測する場合は、セットアップ文に、"form __main__ import 関数名"を指定します。そうしないと、timeitモジュールが関数にアクセスできないようです。

from timeit import Timer

def range_test():
    n = 0
    for i in range(1000): n += 1

def xrange_test():
    n = 0
    for i in xrange(1000): n += 1

t1 = Timer("range_test()", "from __main__ import range_test")
t2 = Timer("xrange_test()", "from __main__ import xrange_test")

print t1.timeit(10000)
print t2.timeit(10000)