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


428

Pythonのタイミングにどちらを使用するのが良いですか?time.clock()またはtime.time()?どちらがより正確ですか?

例えば:

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

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

32
Python 3.3以降time.clock()の使用は非推奨であり、perf_counter()またはを使用することをお勧めしますprocess_time()
Cody Piersall 2014年


参照してください。このコメントプロセスで使用されるすべてのコアがで加算されている方法についてのtime.clocktime.process_timeが、子プロセスがありません。精度に関するこの説明も参照してください(もちろん、システムによって異なります)。
最大

回答:


161

3.3以降、time.clock()は非推奨になり、代わりにtime.process_time()またはtime.perf_counter()を使用することをお勧めします。

以前は2.7で、time module docsによると:

時計()

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

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

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


4
「これは、Pythonまたはタイミングアルゴリズムのベンチマークに使用する関数です。」<br> Pythonのドキュメントは、ここでの回答に基づいて正確ではないようです。time.clock()は、必ずしもベンチマークに必要なものではありません。特にtimeitモジュールが存在する場合
Corey Goldberg

1
@Corey Goldberg:ドキュメントのバグ提出しましたか?(これは、「time ()ではなくclock()を使用することを意味しますが、だらしのないものです)
smci


3
ここで読み取れるようtime.clock()に、プラットフォームの動作は依存していたようですが、そうでtime.process_time()はありません。これがtime.clock()が廃止された理由です。
ジムアホ2016年

46

簡単に言えtime.clock()ば、ほとんどの場合は改善されます。ただし、一部のハードウェア(GPUに配置したアルゴリズムなど)のタイミングを計測している場合は、time.clock()この時間time.time()はなくなり、唯一の解決策となります。

注:どの方法を使用しても、タイミングは制御できない要因に依存します(プロセスが切り替わるタイミング、頻度など)。これはでさらに悪化しますtime.time()time.clock()、1つのタイミングテストのみを実行することはできません。ただし、常に一連のテストを実行し、時間の平均/分散を調べます。


また、非同期の方法でネットワークリソースをリクエストする場合(プロセスは待機するためにブロックされます)、ネットワーク時間は取り除かれます。
デイソン、

25

その他は:再答えているtime.time()time.clock()

ただし、ベンチマークやプロファイリングの目的でコードブロックの実行のタイミングを計っている場合は、timeitモジュールを確認する必要があります


16
+1:OSにtimeit.default_timer割り当てられているtime.time()time.clock()、OSによって異なります。Python 3.3以降default_timertime.perf_counter()すべてのプラットフォームにあります。
jfs

19

注意すべきことの1つは、システム時刻の変更は影響を与えますtime.time()が、影響を与えませんtime.clock()

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

ただし、システム時間の変更(テスト対象のアプリケーションのスケジューラモジュールを確認するため)が必要になる場合があるため、数時間後にシステム時間を設定すると、TCタイムアウトが発生し、テストケースが中止されました。これを適切に処理するには、からに切り替える必要がありtime.time()ましtime.clock()た。


1
これを探していました。ありがとう:)ユーザーがOSから時間を変更した場合でも役に立ちます。
アーシクフセイン2013

この時間とユーザーが時間:分形式で保存した時間を比較するにはどうすればよいですか?
アーシクフセイン2013

19

clock() ->浮動小数点数

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

time() ->浮動小数点数

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

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


17

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


1
正確には、私time.clock()はLinuxサーバーで使用しただけで、確実に得た数は数秒ではありませんでした
RomanPlášilJun

15

time()clock()Linux よりも精度が高くなります。clock()精度は10 ms未満です。一方では、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

だから私はワインにtime()を想定していますか?
Tcll 2016

6

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

たとえば、clock()はWindowsとLinuxで大きく異なります。

あなたが説明する種類の例については、おそらく代わりに「timeit」モジュールが必要です。


3
あなたはどのような方法で、拡張することができclockていますか"very different"
n611x007

5

他の人が指摘time.clock()したように、time.perf_counter()またはを支持して非推奨になりました time.process_time()が、Python 3.7 time.perf_counter_ns()time.process_time_ns()time.time_ns()他の3つの関数とともに、、、およびでのナノ秒の分解能タイミングを導入しています。

これらの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の整数としてナノ秒数を返します。

他の人も述べたように、timeitモジュールを使用して関数と小さなコードスニペットの時間を計ります。


3

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

Windows専用のコードを記述している場合は、どちらも機能します(2つを異なる方法で使用します。time.clock()に減算は必要ありません)。これがUnixシステムで実行される場合、または移植性が保証されているコードが必要な場合は、time.time()を使用する必要があります。


2

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

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

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


2

私の理解の及ぶ限り、time.clock()は、システムで可能な限りの精度を持っています。


2

このコードを使用して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

クロック()= 0.0993572257367


1

正解:どちらも同じ長さの分数です。

しかし、どちらが速いsubjectですtimeか?

小さなテストケース

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つのカウンターをマージできません...


0

time.clock()Python 3.8では、プラットフォームに依存する動作があったため削除されました。

  • 上のUnixの浮動小数点数は、秒単位で表されるように、現在のプロセッサ時間を返します。
  • のWindows、この関数は、浮動小数点数として、この関数の最初の呼び出しからの経過時間をwall-clock秒を返します。

    print(time.clock()); time.sleep(10); print(time.clock())
    # Linux  :  0.0382  0.0384   # see Processor Time
    # Windows: 26.1224 36.1566   # see Wall-Clock Time

では、代わりにどの関数を選ぶべきでしょうか?

  • プロセッサ時間:これは、この特定のプロセスがCPUでアクティブに実行されている時間です。スリープ、Webリクエストの待機、または他のプロセスのみが実行される時間は、これに寄与しません。

    • 使用する time.process_time()
  • 壁時計時間:これは、「壁に掛かっている時計上」、つまりリアルタイム外に経過した時間を指します。

    • 使用する time.perf_counter()

      • time.time() 実時間も測定しますが、リセットできるため、時間を遡ることができます
      • time.monotonic() リセットすることはできません(単調=前進のみ)、精度は time.perf_counter()

-1

Ubuntu LinuxとWindows 7のテスト結果の比較。

Ubuntuの場合

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5005500316619873

Windows 7の場合

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5

他の回答を読んで、Windowsとunix / linuxの違いを理解してください。
Corey Goldberg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.