時刻したい(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で処理を一時停止する場合に使います。

注釈

日付を操作したい場合は、 datetimependulum、 が適しています。

一時停止したい(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を使ってください。