前置き
- blog 記事 と python.org のドキュメント を参考
- python3 で実装されている time.get_clock_info() を使うと、そのシステム(OS)でのtime モジュールの各メソッドの詳細情報がわかる。
- (切り捨ての桁数の把握など)計測する際に重要
time.get_clock_info() の使い方
引数にtime モジュールのメソッドを記入すると、情報が表示される。
>>> import time
>>> time.get_clock_info('clock')
namespace(adjustable=False, implementation='clock()', monotonic=True, resolution=1e-06)
>>>
- adjustable : NTPや手動での変更や補正が可能かどうか。True なら時間補正できる、False ならできない。
- implementation:バックエンドの実装(通常はシステム(OS)上でのCの関数やAPI)。
- monotonic:モノトニッククロック(補正などで後戻りしないクロック)。Trueならモノトニッククロックでの計測。
- resolution:クロックの分解能(秒)
環境ごとの比較
linux上のpython3.6.4の場合
メソッド名 | 時刻補正 | 呼び出しC関数 | monotonic | resolusion (分解能) |
clock() | False | clock() | True | 1e-6 (1マイクロ秒) |
monotonic() | False | clock_gettime(CLOCK_MONOTONIC) | True | 1e-9 (1ナノ秒) |
perf_counter() | False | clock_gettime(CLOCK_MONOTONIC) | True | 1e-9 (1ナノ秒) |
process_time() | False | clock_gettime(CLOCK_PROCESS_CPUTIME_ID) | True | 1e-9 (1ナノ秒) |
time() | True | clock_gettime(CLOCK_REALTIME) | False | 1e-9 (1ナノ秒) |
Windows10 上での python for windows 3.7.1 の場合
メソッド名 | 時間補正 | 呼び出しC関数 | monotonic | resolution (分解能) |
clock() | False | QueryPeformanceCounter() | True | 3.526169e-07 (352.169 ナノ秒) |
monotonic() | False | GetTickCount64() | True | 1.562500e-02 ( 15.625ミリ秒) |
perf_counter() | False | QueryPerformanceCounter() | True | 3.526169e-07 (352.169 ナノ秒) |
process_time() | False | GetProcessTimes() | True | 1.000000e-07 (100ナノ秒) |
time() | True | GetSystemTimeAsFileTime() | False | 1.562500e-02 (15.625ミリ秒) |
補足
- 時刻補正有りで実時刻を計測したい場合はtime.time() を使うのが良い。
- 処理時間(経過時間)を計測したい場合は時刻補正と後戻りのない time.perf_counter() または time.monotonic() を使うほうが良い。
- time.monotonic()はOSにより実装と精度が異なる。
- time.perf_counter()はsleep()中の経過時間も含まれるので、sleep()処理を含んだ経過時間の計測に向いている。
- time.process_time() は sleep() 中の経過時間を含まないので、sleep()処理を含んだ経過時間の計測には向かない。
- scientific linux の場合、time.monotonic() と time.perf_counter()は同じもの。
- windows の場合、time.perf_counter()はプロセスごとのカウンターなので、異なるプロセス間での経過時間差分の計測には向かない。