3秒でわかる
処理にかかった時間を測るための Python の高精度タイマー。時刻の補正に影響されないので、性能改善の前後比較で使われます。
もう少し詳しく
どういうものか
time.perf_counter() は、ある基準点からの経過秒数を float で返す関数です。基準点がいつなのかは決まっておらず、返ってきた数値そのものには意味がありません。2回呼んで引き算し、その差だけを使います。
利用できる中で最も分解能の高いタイマーが選ばれるため、ミリ秒よりずっと細かい差も測れます。
なぜ必要か
time.time() は壁掛け時計の時刻を返します。時刻は NTP による同期や夏時間の切り替えで補正されるので、測っている最中に巻き戻り、経過時間がマイナスになることがあります。処理時間の計測でほしいのは「一定の速さで進み続けるカウンタ」であり、それを保証するのが perf_counter です。
具体例
改善の前後を同じ条件で測り、数字で比べます。
import time
def measure(fn, *args):
start = time.perf_counter()
result = fn(*args)
elapsed = time.perf_counter() - start
print(f"{fn.__name__} took {elapsed:.6f} s")
return result
def slow(n):
return sum([i * i for i in range(n)])
def fast(n):
return sum(i * i for i in range(n))
measure(slow, 2_000_000)
measure(fast, 2_000_000)短い処理を1回だけ測ると、その瞬間のゆらぎに埋もれます。マイクロ秒単位のコードは timeit で何万回か繰り返してください。
つまずきやすいところ
time.process_time ですtime.perf_counter_ns を使います似た用語との違い
| 関数 | 測るもの | 巻き戻り |
|---|---|---|
| time.perf_counter | 実時間。最も高精度 | しない |
| time.time | 壁時計の時刻 | する |
| time.monotonic | 実時間。粗くてよい用途 | しない |
| time.process_time | 自プロセスの CPU 時間 | しない |
覚え方
perf は performance の略で、性能測定のための時計です。時刻を知りたいなら time.time、速さを知りたいなら perf_counter と分けます。