web-dev-qa-db-ja.com

Pythonのtime.clock()とtime.time()の精度は?

Pythonでタイミングをとるのに適したものはどれですか。 time.clock()またはtime.time()どれがより正確さを提供しますか?

例えば:

start = time.clock()
... do something
elapsed = (time.clock() - start)

vs.

start = time.time()
... do something
elapsed = (time.time() - start)
406
Corey Goldberg

3.3の時点で、 time.clock()は非推奨 で、time.process_time()またはtimeの使用をお勧めします。代わりにperf_counter()

以前の2.7では、時間モジュールdocsによると、

time.clock()

Unixでは、現在のプロセッサ時間を秒単位の浮動小数点数として返します。精度、そして実際には「プロセッサ時間」の意味の厳密な定義は、同じ名前のC関数の精度に依存しますが、いずれにせよ、 これはPythonまたはタイミングアルゴリズムのベンチマークに使用する関数です。 。

Windowsでは、この関数は、Win32関数QueryPerformanceCounter()に基づいて、この関数を最初に呼び出してから経過した実時間を浮動小数点数として返します。分解能は通常1マイクロ秒より優れています。

さらに、コードスニペットのベンチマーク用に timeit モジュールがあります。

144
Jason Navarrete

簡単な答えは次のとおりです。ほとんどの場合、time.clock()は良くなります。ただし、ハードウェアをタイミング調整する場合(たとえば、GPUにアルゴリズムを追加する場合など)は、time.clock()がこの時点で取り除かれ、time.time()が唯一の解決策となります。

注:どの方法を使用しても、タイミングは制御できない要因(プロセスの切り替え時期、頻度など)によって異なります。これはtime.time()ではさらに悪化しますが、time.clock()でも発生するため、タイミングテストを実行しないでください。しかし、常に一連のテストを実行し、時間の平均/分散を調べます。

45
PierreBdR

その他 re:time.time() vs. time.clock().

ただし、ベンチマーク/プロファイリングを目的としてコードブロックの実行をタイミングを取っている場合は、 timeitモジュール をご覧ください。

24
dF.

留意すべき1つのこと:システム時刻を変更するとtime.time()に影響がありますがtime.clock()には影響しません。

自動テストの実行を制御する必要がありました。テストケースの1ステップに一定の時間以上かかると、そのTCは次のステップに進むために中止されました。

しかし、時々システム時間を変更する(テスト中のアプリケーションのスケジューラモジュールをチェックする)必要があるので、将来システム時間を数時間設定した後、TCタイムアウトが期限切れになり、テストケースが中断されました。これを正しく処理するには、time.time()からtime.clock()に切り替える必要がありました。

19
Seba

clock() - >浮動小数点数

プロセスの開始以降、または最初のclock()の呼び出し以降のCPU時間またはリアルタイムを返します。これはシステムが記録するのと同じくらいの精度を持っています。

time() - >浮動小数点数

エポック以降の現在の時間を秒数で返します。システムクロックがそれらを提供する場合、秒の端数が存在する場合があります。

オペレーティングシステムはプロセスの実行時間をシステム時間(つまり実際の時間)と同じ精度で格納しないため、通常time()の方が正確です。

18
Vinko Vrsalovic

あなたが気にしていることによります。 WALL TIME(壁の時計の時間など)を意味する場合、time.clock()はCPU時間を管理する可能性があるため、正確さは提供されません。

17
user15910

私の考えでは、practice. time()はLinuxのclock()よりも精度が優れています。 clock()の精度は10ミリ秒未満です。一方time()は正確な精度を与えます。私のテストはCentOS 6.4、python 2.6です。

using time():

1 requests, response time: 14.1749382019 ms
2 requests, response time: 8.01301002502 ms
3 requests, response time: 8.01491737366 ms
4 requests, response time: 8.41021537781 ms
5 requests, response time: 8.38804244995 ms

using clock():

1 requests, response time: 10.0 ms
2 requests, response time: 0.0 ms 
3 requests, response time: 0.0 ms
4 requests, response time: 10.0 ms
5 requests, response time: 0.0 ms 
6 requests, response time: 0.0 ms
7 requests, response time: 0.0 ms 
8 requests, response time: 0.0 ms
13
bestwolf1983

違いは非常にプラットフォーム固有です。

たとえば、clock()は、LinuxとWindowsでは非常に異なります。

あなたが説明するような例のためには、おそらく代わりに "timeit"モジュールが欲しいでしょう。

6
Justin Sheehy

Unixではtime.clock()は現在のプロセスが使用しているCPU時間を測定するので、過去のある時点からの経過時間を測定するのには良くありません。 Windowsでは、関数が最初に呼び出されてから経過したウォールクロックの秒数を測定します。どちらのシステムでもtime.time()はEpochから経過した秒数を返します。

Windows専用のコードを書いているのであれば、どちらでもうまくいくでしょう(ただし、2つの使い方は異なります - time.clock()に減算は必要ありません)。これがUnixシステム上で実行される予定であるか、移植性が保証されているコードが必要な場合は、time.time()を使用することをお勧めします。

3
auspace

簡単な答え:Pythonのタイミングには time.clock() を使用してください。

* nixシステムでは、clock()はプロセッサ時間を秒単位の浮動小数点数として返します。 Windowsでは、この関数を最初に呼び出してから経過した秒数を浮動小数点数として返します。

time()は、エポック以降の秒数をUTCで浮動小数点数として返します。たとえtime()が浮動小数点数を返すとしても、あなたが1秒より良い精度を得るという保証はありません。また、システムクロックがこの関数の2回の呼び出しの間に戻された場合、2番目の関数呼び出しは低い値を返します。

2
Babak

私は2つの方法を比較するためにこのコードを使用します。私のOSはwindows 8、プロセッサコアi5、RAM 4GBです

import time

def t_time():
    start=time.time()
    time.sleep(0.1)
    return (time.time()-start)


def t_clock():
    start=time.clock()
    time.sleep(0.1)
    return (time.clock()-start)




counter_time=0
counter_clock=0

for i in range(1,100):
    counter_time += t_time()

    for i in range(1,100):
        counter_clock += t_clock()

print "time() =",counter_time/100
print "clock() =",counter_clock/100

出力:

time()= 0.0993799996376

clock()= 0.0993572257367

2

私の知る限りでは、time.clock()はあなたのシステムが許す限りの精度を持っています。

2
Jake

正しい答え: どちらも同じ長さの分数です。

しかし、subjecttimeであればどちらが速いでしょうか。

ちょっとしたテストケース

import timeit
import time

clock_list = []
time_list = []

test1 = """
def test(v=time.clock()):
    s = time.clock() - v
"""

test2 = """
def test(v=time.time()):
    s = time.time() - v
"""
def test_it(Range) :
    for i in range(Range) :
        clk = timeit.timeit(test1, number=10000)
        clock_list.append(clk)
        tml = timeit.timeit(test2, number=10000)
        time_list.append(tml)

test_it(100)

print "Clock Min: %f Max: %f Average: %f" %(min(clock_list), max(clock_list), sum(clock_list)/float(len(clock_list)))
print "Time  Min: %f Max: %f Average: %f" %(min(time_list), max(time_list), sum(time_list)/float(len(time_list)))

私はスイスの実験室で働いていませんが、私はテストしました..

この質問に基づくと:time.clock()time.time()より優れています

編集:time.clock()は内部カウンタなので、外部で使用することはできず、max 32BIT FLOATという制限があります。最初の値と最後の値を格納しないとカウントできません。他の1つのカウンターをマージできません...

1
dsgdfg

他の人が指摘したようにtime.clock()time.perf_counter()またはtime.process_time()を支持して廃止予定ですが、Python 3.7では time.perf_counter_ns()time.process_time_ns() 、および time.time_ns() のナノ秒解決タイミングが導入されました。

これらの6つの新しいナノ秒解決機能は PEP 564 に詳述されています。

time.clock_gettime_ns(clock_id)

time.clock_settime_ns(clock_id, time:int)

time.monotonic_ns()

time.perf_counter_ns()

time.process_time_ns()

time.time_ns()

これらの関数は_ns接尾辞のないバージョンと似ていますが、Pythonのintとして数ナノ秒を返します。

また他の人が指摘しているように、 timeitモジュール を使って関数と小さなコードスニペットの時間を計ってください。

1
Chris_Rands