前置き

  • 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関数monotonicresolusion
(分解能)
clock()Falseclock()True1e-6 (1マイクロ秒)
monotonic()Falseclock_gettime(CLOCK_MONOTONIC)True1e-9
(1ナノ秒)
perf_counter()Falseclock_gettime(CLOCK_MONOTONIC)True1e-9
(1ナノ秒)
process_time()Falseclock_gettime(CLOCK_PROCESS_CPUTIME_ID)True1e-9
(1ナノ秒)
time()Trueclock_gettime(CLOCK_REALTIME)False1e-9
(1ナノ秒)

Windows10 上での python for windows 3.7.1 の場合

メソッド名時間補正呼び出しC関数monotonicresolution
(分解能)
clock()FalseQueryPeformanceCounter()True3.526169e-07
(352.169 ナノ秒)
monotonic()FalseGetTickCount64()True1.562500e-02
( 15.625ミリ秒)
perf_counter()FalseQueryPerformanceCounter()True3.526169e-07
(352.169 ナノ秒)
process_time()FalseGetProcessTimes()True1.000000e-07
(100ナノ秒)
time()TrueGetSystemTimeAsFileTime()False1.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()はプロセスごとのカウンターなので、異なるプロセス間での経過時間差分の計測には向かない。