Python プログラムの実行時間を測定

株式会社リュディアです。今回は Python プログラムの実行時間の測定方法についてまとめてみます。

大きなプログラムになってくると全体を高速化するために最も時間を要している部分を高速化することが重要になります。今回のまとめはその際の解析手法の一環と考えてください。最初は time.time() を使う方法です。以下の例を見てください。

import time

t1 = time.time() 

for i in range(10000):
   i ** 10

t2 = time.time()

for i in range(10000):
   i ** 10

t3 = time.time()

t2_t1 = t2 - t1
t3_t1 = t3 - t1

print(f't2 - t1:{t2_t1}')
print(f't3 - t1:{t3_t1}')

# t2 - t1:0.003001689910888672
# t3 - t1:0.0060002803802490234

time.time() の返り値として呼び出したときの時間を取得します。測定開始時の時間を t1 = time.time() で取得します。そのあと測定したい部分の時間を t2, t3 として取得し、最後に測定対象時間を t2 - t1, t3 - t1 のように差分をとって取得します。今回の例であれば t2 - t1 は約 3ミリ秒、t3 - t1 は約 6ミリ秒となっています。

大雑把な時間測定では time を用いてもよいのですが time.time() は精度の観点から問題があるという記事をよくみかけます。細かい話になりますが OS のプロセススケジューリングの扱いが影響しているように見えます。高い精度が必要な場合は time.perf_counter() を使うべきとのことなので以下にまとめてみます。

import time

t1 = time.time() 
t1p = time.perf_counter()

for i in range(10000):
   i ** 10

t2 = time.time()
t2p = time.perf_counter()

for i in range(10000):
   i ** 10

t3 = time.time()
t3p = time.perf_counter()

t2_t1 = t2 - t1
t3_t1 = t3 - t1

t2p_t1p = t2p - t1p
t3p_t1p = t3p - t1p

print(f't2 - t1:{t2_t1}')
print(f't3 - t1:{t3_t1}')

print(f't2p - t1p:{t2p_t1p}')
print(f't3p - t1p:{t3p_t1p}')

# t2 - t1:0.0029993057250976562
# t3 - t1:0.006184816360473633
# t2p - t1p:0.002938099998573307
# t3p - t1p:0.005719500004488509

time.time() と time.perf_counter() を使った測定値が微妙に異なるのは、time.perf_counter() の差分を取るときには time.time() の差分を取る計算時間が含まれるためだと考えています。この例のレベルでは time.time() と time.perf_counter() の精度差を明確に見ることはできませんでした。ただ time.perf_counter() の方が精度が高いということは明確なようなので精度が必要な場合は time.perf_counter() を使った方がよいと考えています。time.time() も time.perf_counter() も使い方は同じです。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?