時刻したい(time)
1import time
2
3# Get unixtime (since epoch 1970-01-01)
4ut = time.time()
5
6# Convert to unixtime to local time (struct_time)
7now = time.localtime(ut)
8
9# Convert struct_time to string
10timestamp = time.strftime("%Y-%m-%d %H:%M:%S", now)
timeモジュールは、時間を操作できる標準ライブラリです。
time.sleepで処理を一時停止する場合に使います。
一時停止したい(time.sleep)
1# sleep for 0.5 seconds
2time.sleep(0.5)
time.sleepで一時停止できます。
時間は秒で指定します。
経過時間したい(time.monotonic / time.monotonic_ns)
1# Get start time position
2started = time.monotonic()
3
4# Run main process
5for i in range(100):
6 # something to do
7 time.sleep(0.1) # simulate worklaod
8
9# Get stopped time position
10stopped = time.monotonic()
11elapsed = stopped - started
time.monotonicは、単調増加する時間カウンターです。
絶対に後戻りすることがないため、経過時間の計測に適しています。
注釈
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 # handle timeout (break / raise / retry)
11 break
12
13 # something todo
14
15 # avoid busy loop (reduce CPU usage)
16 # sleep up to interval, but not beyond the deadline
17 remaining = deadline - now
18 time.sleep(min(interval, remaining))
タイムアウト処理やリトライ処理に利用できます。
ループ処理の直前で〆切時刻(deadline)を設定し、
ループ内で現在時刻と比較することで、タイムアウトを判定します。
注釈
上記サンプルでは、〆切直前にスリープ時間を調整する処理を追加し、
タイムアウト検知の遅延を抑えています。
スリープ時間(interval)が長いほど、タイムアウト検知が遅れるので、
この調整は重要です。
高精度で計測したい(time.perf_counter)
1# Get started time position
2started = time.perf_counter()
3
4# Run main process
5for i in range(10000000000):
6 pass
7
8# Get stopped time position
9stopped = time.perf_counter()
10elapsed = stopped - started
time.perf_counterで精度が高い時刻を取得できます。