[解決!Python]timeモジュールで実行時間を計測するには:解決!Python
timeモジュールのtime関数やperf_counter関数を使って、特定の処理の実行にかかった時間を計測する方法を紹介する。
# 基本型
import time
start = time.time() # 現在時刻(処理開始前)を取得
# 実行したい処理を記述
end = time.time() # 現在時刻(処理完了後)を取得
time_diff = end - start # 処理完了後の時刻から処理開始前の時刻を減算する
print(time_diff) # 処理にかかった時間データを使用
def fact(x):
result = 1
if x == 0 or x == 1:
return result # 0!と1!の値は1
for n in range(1, x+1):
result *= n
return result
start = time.time()
for n in range(10000):
result = fact(1000)
end = time.time()
time_diff = end - start
print(time_diff)
# time.perf_counter関数を使う
start = time.perf_counter()
for n in range(10000):
result = fact(1000)
end = time.perf_counter()
time_diff = end - start
print(time_diff)
# 処理時間を計測する関数を定義
def get_time_diff(func, *args, time_func=time.time, count=1000):
result = None
start = time_func()
for _ in range(count):
result = func(*args)
end = time_func()
time_diff = end - start
return time_diff, result
time_diff, result = get_time_diff(fact, 1000)
timeモジュールのtime関数/perf_counter関数を使った実行時間の計測
Pythonのtimeモジュールにはtime関数やperf_counter関数がある。これらの関数を使うと、特定の処理にかかった時間を計測できる。
その手順はおおよそ次のようになる。
- 処理を始める直前でtime.time関数やtime.perf_counter関数を呼び出して、処理開始時点の値を取得する
- 実行時間を計測したい処理を記述する
- 処理が終わった時点でtime.time関数やtime.perf_counter関数をもう一度呼び出して、処理終了時点の値を取得する
- 処理終了時点の値から処理開始時点の値を減算することで、処理にかかった時間が分かる
これをコードにすると次のようになる。
import time
start = time.time() # 現在時刻(処理開始前)を取得
# 実行したい処理を記述
end = time.time() # 現在時刻(処理完了後)を取得
time_diff = end - start # 処理完了後の時刻から処理開始前の時刻を減算する
print(time_diff) # 処理にかかった時間データを使用
ここでは階乗を求める以下の関数があったとして、それを1万回呼び出したときにかかる時間を計測したいとしよう。
def fact(x):
if x == 0 or x == 1:
return 1
result = 1
for n in range(1, x+1):
result *= n
return result
上で述べた実行時間を計測する手順に合わせると、コードは次のようになる。
import time
start = time.time()
for n in range(10000): # 実行時間を計測したいコード
result = fact(1000)
end = time.time()
time_diff = end - start
print(time_diff)
このときにかかる時間はPCやOSなどの実行環境によって異なるが、一例を以下に示す(Visual Studio CodeのPython拡張機能を使用)。
time.time関数呼び出しの間に、実行時間を計測した処理を記述するだけ、というのが基本だ。
なお、time.time関数のドキュメントによると、この関数はエポック(1970年1月1日の00:0:00)からの経過秒数を浮動小数点数値で返すものだ。そして、「すべてのシステムが 1 秒より高い精度で時刻を提供するとは限らないので注意してください」との記述もある。高い精度で実行時間を計測する必要があれば、time.perf_counter関数を使うのがよいだろう。
time.perf_counter関数はtime.time関数とは異なり、戻り値の基準点が定義されていない(エポックからの経過秒数が返されるわけではない)点には注意すること。つまり、処理開始前と処理終了後の2つの計測値の差分には意味があるが、単にどこかのタイミングで一度この関数を呼び出すだけでは意味がないということだ。
このことを除けば、time.perf_counter関数の使い方はtime.time関数と同様である。以下に例を示す。
start = time.perf_counter()
for n in range(10000):
result = fact(1000)
end = time.perf_counter()
time_diff = end - start
print(time_diff)
実行時間の計測を頻繁に行うのであれば、毎回毎回上記のようなコードを書くのは面倒かもしれない。そうしたときには、例えば以下のような、実行時間を計測する関数を定義してしまうのがよい。
def get_time_diff(func, *args, time_func=time.time, count=1000):
result = None
start = time_func()
for _ in range(count):
result = func(*args)
end = time_func()
time_diff = end - start
return time_diff, result
この関数は実行時間を計測したい関数とその引数、計測に使用する関数(デフォルト値はtime.time関数)、繰り返し実行する回数(デフォルト値は1000)をパラメーターに受け取り、実行にかかった時間と実行結果を戻り値とする。使い方は次のようになる。
time_diff, result = get_time_diff(fact, 1000)
print(time_diff)
Copyright© Digital Advantage Corp. All Rights Reserved.