HOWTO · Python

Python のタイマー関数

このチュートリアルでは、Python コードの実行時間を監視および分析する方法を示します。

このページの内容

経過時間を測る一般的な用途には time.perf_counter() を使い、現在のプロセスが消費した CPU 時間を知りたい場合は time.process_time() を選びます。time モジュールには、システム時刻のタイムスタンプを取得する time.time() と、システム時刻の調整に左右されない経過時間を測る time.monotonic() もあります。どの方法でも、開始時の値を記録してから処理を実行し、終了時の値を記録して、開始値を終了値から引きます。以下のコード例は使い方を示すもので、測定時間は実行する環境やタイミングによって変わります。

time.time() でシステム時刻を測定する

time.time() は、Unix エポック(1970年1月1日 00:00:00 UTC)からの経過秒数として、現在のシステム時刻を返します。保存、表示、または別のタイムスタンプとの比較に使う値が必要な場合に適しています。システム時刻に従うため、OS やユーザーによる時刻調整で値が変わることがあります。そのため、短い時間間隔の測定には通常向きません。2回の読み取りの間に時刻が調整されると、差分が実際の経過時間を正しく表さない場合があります。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import time

start = time.time()
total = sum(range(1, 1001))
end = time.time()

print(f"sum={total}")
print(f"elapsed={end - start:.6f} seconds")

1行目には常に同じ合計値が表示され、2行目には測定時間が表示されます。測定時間は実行ごとに変わります。差分が意図した処理時間を表すように、測定対象のコードを2回の読み取りの間に置いてください。

time.process_time() で CPU 時間を測定する

time.process_time() は、現在のプロセスが消費した CPU 時間を測定します。スリープ中や、入力、ネットワーク応答、別のプロセスを待っている時間は含まれません。処理が完了するまでユーザーが待つ時間ではなく、コードがどれだけプロセッサ時間を使ったかを見積もる場合に使います。終了時の値から開始時の値を引くと、その間の処理に使われた CPU 時間が得られます。

このセクションのコードと表示されるラベルや出力は英語のままです。

import time

start = time.process_time()
total = sum(number * number for number in range(100_000))
cpu_seconds = time.process_time() - start
print(f"sum={total}; CPU time={cpu_seconds:.6f} seconds")

待ち時間の多い処理では、CPU 時間が実際の経過時間より大幅に短くなることがあります。この差から計算処理と待機を区別できますが、プロセスが何を待っていたかまでは分かりません。

time.perf_counter() で経過時間を測定する

time.perf_counter() は、経過時間の測定を目的とした高分解能の単調増加時計です。起点は定められていないため、個々の値を日付やタイムスタンプとして解釈せず、読み取り値どうしの差を使ってください。プロセスの CPU 時間とは異なり、スリープや待機に費やした時間も経過時間に含まれます。短い関数にも長時間の処理にも適しており、精度が高いからといって小規模な処理だけに用途が限られるわけではありません。

このセクションのコードと表示されるラベルや出力は英語のままです。

import time

start = time.perf_counter()
time.sleep(0.1)
elapsed = time.perf_counter() - start
print(f"elapsed={elapsed:.3f} seconds")

測定結果は指定したスリープ時間に近い値になりますが、スケジューリングやシステム負荷によって、さらに時間がかかることがあります。ベンチマークでは、1回の測定値を保証された結果とみなさず、条件をそろえて同等の処理を繰り返し、測定値を比較してください。

time.monotonic() で経過時間を測定する

time.monotonic() も経過時間を測定します。この時計はシステム時刻の更新によって逆行しません。基準点は定義されていないため、意味があるのは読み取り値どうしの差だけです。システム時刻の変更が計算に影響してはならない場合、タイムアウトの期限や経過時間の確認に使います。外部の時刻変更に合わせて読み取り値を調整するのではなく、間隔の測定でその変更の影響を受けないようにします。

このセクションのコードと表示されるラベルや出力は英語のままです。

import time

start = time.monotonic()
time.sleep(0.1)
elapsed = time.monotonic() - start
print(f"elapsed={elapsed:.3f} seconds")

Unix タイムスタンプが必要なら time.time()、プロセスが消費した CPU 時間を測るなら time.process_time()、一般的な経過時間の測定には time.perf_counter() を選びます。システム時刻が変わっても間隔やタイムアウトを正しく測りたい場合は time.monotonic() を使います。いずれの場合も、2回の読み取りの間に置いたコードが、測定対象となる処理を決めます。