Pythonのタイミングに使用するのに適しているのはどれですか?time.clock()またはtime.time()?どちらがより正確になりますか?
例えば:
start = time.clock()
... do something
elapsed = (time.clock() - start)
対。
start = time.time()
... do something
elapsed = (time.time() - start)
3.3 の時点で、time.clock()は非推奨であり、代わりに time.process_time ()またはtime.perf_counter( )を使用することをお勧めします。
time モジュールのドキュメントによると、以前は 2.7でした:
時計()
Unix では、現在のプロセッサ時間を秒単位の浮動小数点数として返します。精度、そして実際には「プロセッサ時間」の意味の定義そのものは、同名の C 関数の精度に依存しますが、いずれにせよ、これは Python やタイミング アルゴリズムのベンチマークに使用する関数です。
Windows では、この関数は、Win32 関数 QueryPerformanceCounter() に基づいて、この関数を最初に呼び出してから経過した壁時計の秒数を浮動小数点数として返します。通常、分解能は 1 マイクロ秒よりも優れています。
さらに、コード スニペットのベンチマーク用のtimeitモジュールがあります。
簡単に言えば、ほとんどのtime.clock()
場合は改善されます。ただし、一部のハードウェア (たとえば、GPU に配置したアルゴリズム) のタイミングを調整している場合はtime.clock()
、この時間が取り除かれ、time.time()
残された唯一の解決策になります。
time.time()
注: どの方法を使用しても、タイミングは制御できない要因 (プロセスが切り替わる時期、頻度など) によって異なりますtime.clock()
。ただし、常に一連のテストを実行し、時間の平均/分散を確認してください。
他の人time.time()
は re: vs.と答えていtime.clock()
ます。
ただし、ベンチマーク/プロファイリングの目的でコード ブロックの実行のタイミングを計っている場合は、timeit
モジュールを確認する必要があります。
システム時刻を変更すると に影響しますが、影響time.time()
はありませんtime.clock()
。
自動テストの実行を制御する必要がありました。テスト ケースの 1 つのステップに一定の時間がかかった場合、その TC は中止され、次のステップに進みました。
ただし、(テスト対象のアプリケーションのスケジューラ モジュールを確認するために) システム時刻を変更する手順が必要になる場合があったため、システム時刻を数時間先に設定した後、TC タイムアウトが期限切れになり、テスト ケースが中止されました。これを適切に処理するには、 からtime.time()
に切り替える必要がありました。time.clock()
clock()
-> 浮動小数点数
プロセスの開始以降、または への最初の呼び出し以降の CPU 時間またはリアルタイムを返しますclock()
。これは、システムが記録するのと同じくらい正確です。
time()
-> 浮動小数点数
エポックからの現在の時間を秒単位で返します。システム クロックが提供する場合、1 秒未満が存在する場合があります。
time()
オペレーティング システムはシステム時間 (つまり、実際の時間) を保存する精度でプロセスの実行時間を保存しないため、通常はより正確です。
何を気にするかによります。WALL TIME (壁の時計の時間など) を意味する場合、time.clock() は CPU 時間を管理する可能性があるため、精度は提供されません。
time()
clock()
Linuxよりも精度が高くなります。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
違いはプラットフォーム固有です。
たとえば、clock() は、Windows と Linux では大きく異なります。
あなたが説明する例の種類については、代わりに「timeit」モジュールが必要になるでしょう。
このコードを使用して 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
Unix では、 time.clock() は現在のプロセスが使用した CPU 時間を測定するため、過去のある時点からの経過時間を測定するのには適していません。Windows では、関数の最初の呼び出しから経過した壁時計の秒数を測定します。どちらのシステムでも time.time() はエポックから経過した秒数を返します。
Windows 専用のコードを作成している場合は、どちらでも機能します (ただし、2 つの方法は異なる方法で使用します - time.clock() では減算は必要ありません)。これが Unix システムで実行される場合、または移植性が保証されているコードが必要な場合は、time.time() を使用する必要があります。
私の理解の範囲では、 time.clock() は、システムが許容できる限りの精度を持っています。
簡単な答え: Python でのタイミングにはtime.clock()を使用します。
*nix システムでは、clock() はプロセッサ時間を秒単位の浮動小数点数として返します。Windows では、この関数を最初に呼び出してから経過した秒数を浮動小数点数で返します。
time() は、エポックからの秒数を UTC で浮動小数点数として返します。1 秒以上の精度が得られるという保証はありません (time() が浮動小数点数を返しますが)。また、この関数への 2 回の呼び出しの間にシステム クロックが戻された場合、2 回目の関数呼び出しはより低い値を返すことに注意してください。
正解:どちらも同じ分数の長さです。
しかし、どちらが速いです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
、最初/最後の値を保存しないとカウントを継続できません。別のカウンターをマージできません...
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