プログラムのパフォーマンスを評価する際、「処理にどれくらいの時間がかかったか」を正確に計測することは重要です。Pythonの標準ライブラリである time モジュールには、時間を計測するための関数がいくつか用意されていますが、目的に応じて適切なものを選択する必要があります。
この記事では、最も代表的な2つの計測関数 time.perf_counter() と time.process_time() の使い方と、その決定的な違いについて解説します。
1. 実時間(経過時間)を計測する:time.perf_counter()
time.perf_counter() は、パフォーマンス計測のために設計された、最も精度の高いクロックです。
この関数は、プログラムが実行されている間の**「実時間(Wall-clock time)」を計測します。つまり、計算処理をしている時間だけでなく、time.sleep() で待機している時間や、他のプロセスが動くのを待っている時間も含めた、「時計の針が進んだ時間」**そのものを返します。
処理全体の所要時間を知りたい場合は、この関数を使用します。
実行例:計算と待機を含む処理
リストのソート(計算処理)と、0.5秒の待機(スリープ)を行い、その合計時間を計測します。
import time
import random
# 計測開始
start_clock = time.perf_counter()
# 1. CPUを使う処理(リストのソート)
data_list = [random.random() for _ in range(100000)]
data_list.sort()
# 2. CPUを使わない処理(0.5秒待機)
time.sleep(0.5)
# 計測終了
end_clock = time.perf_counter()
# 経過時間を計算
elapsed_time = end_clock - start_clock
print(f"perf_counter計測結果: {elapsed_time:.5f}秒")
実行結果(例):
perf_counter計測結果: 0.53421秒
ソートにかかった時間(約0.03秒)と、スリープした時間(0.5秒)の合計が計測されています。
2. CPU時間を計測する:time.process_time()
time.process_time() は、現在のプロセスが実際にCPUを使用した**「CPU時間(CPU time)」**を計測します。
この関数の最大の特徴は、time.sleep() のようなスリープ時間や、I/O待ち(ファイル読み書きや通信の待ち時間)を含まない点です。プログラムが純粋に計算処理のためにCPUを占有していた時間だけを知りたい場合に使用します。
実行例:同じ処理を計測
先ほどと同じ「ソート処理 + 0.5秒待機」を process_time() で計測します。
import time
import random
# 計測開始
start_cpu = time.process_time()
# 1. CPUを使う処理
data_list = [random.random() for _ in range(100000)]
data_list.sort()
# 2. CPUを使わない処理(0.5秒待機)
# process_time はこの待機時間をカウントしない
time.sleep(0.5)
# 計測終了
end_cpu = time.process_time()
# 経過時間を計算
elapsed_cpu = end_cpu - start_cpu
print(f"process_time計測結果: {elapsed_cpu:.5f}秒")
実行結果(例):
process_time計測結果: 0.03125秒
スリープしていた0.5秒間はCPUを使用していないため、計測結果に含まれていません。純粋にリストの生成とソートにかかった時間のみが出力されています。
まとめ:使い分けの指針
2つの関数の違いを整理します。
| 関数名 | 計測対象 | sleep時間 | 用途 |
time.perf_counter() | 実時間(経過時間) | 含む | ユーザーから見た待ち時間や、処理全体の所要時間を知りたい場合。 |
time.process_time() | CPU時間 | 含まない | アルゴリズムの純粋な計算速度を測定したい場合や、CPU負荷を知りたい場合。 |
一般的に「処理が遅い」と感じて原因を調査する際は、まず perf_counter() で全体時間を把握し、それがCPUによるものなのか、通信などの待機によるものなのかを切り分けるために process_time() を併用する、といったアプローチが有効です。
