時刻したい(time)
1import time
2
3# UNIX時間を取得(1970-01-01からの経過秒数)
4ut = time.time()
5
6# UNIX時間をローカル時刻(struct_time)に変換
7now = time.localtime(ut)
8
9# struct_timeを文字列に変換
10timestamp = time.strftime("%Y-%m-%d %H:%M:%S", now)
timeモジュールは、時間を操作できる標準ライブラリです。
time.sleepで処理を一時停止する場合に使います。
一時停止したい(time.sleep)
1# 0.5秒待機
2time.sleep(0.5)
time.sleepで一時停止できます。
時間は秒で指定します。
経過時間したい(time.monotonic / time.monotonic_ns)
1# 計測開始
2started = time.monotonic()
3
4# メイン処理を実行
5for i in range(100):
6 # なんらかの処理
7 time.sleep(0.1) # workloadを模擬
8
9# 計測終了
10stopped = time.monotonic()
11elapsed = stopped - started
time.monotonicは、単調増加する時間カウンターです。
絶対に後戻りすることがないため、経過時間の計測に適しています。
time.monotonic_nsは、同じ性質をもつナノ秒精度の整数版です。
浮動小数点の誤差を避けたい場合や、より高い精度が必要な場合に使います。
1started = time.monotonic_ns()
2# ...
3elapsed_ns = time.monotonic_ns() - started
注釈
time.timeで取得できる時刻情報は、パソコンのシステム時刻に依存します。
NTP同期や手動で時計が変更された場合、時刻が前後にずれることがあります。
このような場合、end - startで計算した経過時間が負の値になる可能性があります。
一方で、time.monotonicは、絶対に後戻りしない時間カウンターです。
単一の値に意味はなく「時間差(経過時間)」にのみ意味があります。
システム時刻の変更の影響を受けないため、経過時間が負になることはありません。
プロセスの経過時間やタイムアウト計測にはtime.monotonicを使うべきです。
1timeout = 5
2interval = 0.01
3deadline = time.monotonic() + timeout
4
5while True:
6 now = time.monotonic()
7
8 if now >= deadline:
9 print("timeout")
10 # タイムアウト時の処理(break / raise / retryなど)
11 break
12
13 # なんらかの処理
14
15 # ビジーループを避ける(CPU使用率を下げる)
16 # 〆切を超えない範囲でintervalだけ待機する
17 remaining = deadline - now
18 time.sleep(min(interval, remaining))
タイムアウト処理やリトライ処理に利用できます。
ループ処理の直前で〆切時刻(deadline)を設定し、
ループ内で現在時刻と比較することで、タイムアウトを判定します。
注釈
上記サンプルでは、〆切直前にスリープ時間を調整する処理を追加し、
タイムアウト検知の遅延を抑えています。
スリープ時間(interval)が長いほど、タイムアウト検知が遅れるので、
この調整は重要です。
高精度で計測したい(time.perf_counter)
1# 計測開始
2started = time.perf_counter()
3
4# メイン処理を実行
5for i in range(1000000):
6 pass
7
8# 計測終了
9stopped = time.perf_counter()
10elapsed = stopped - started
time.perf_counterで精度が高い時刻を取得できます。
time.monotonicと同様、ナノ秒精度の整数を返すtime.perf_counter_nsもあります。
注釈
time.perf_counterは、スリープ中の時間も含めた「実時間(wall clock time)」を計測します。
CPUが実際に処理に使った時間(スリープ中を除く)だけを知りたい場合は、
time.process_timeを使ってください。