コードのセクションを高速テストするためにPythonで2回比較する適切な方法は何ですか? APIドキュメントを読んでみました。 timedeltaのことを理解しているかわかりません。
これまでのところ、私はこのコードを持っています:
from datetime import datetime
tstart = datetime.now()
print t1
# code to speed test
tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here
datetime.timedelta
は、2つの日付時刻の差にすぎません...つまり、日/秒/マイクロ秒単位の期間のようなものです
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a
>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543
c.microseconds
はタイムデルタのマイクロ秒部分のみを返すことに注意してください!タイミングのために、常にc.total_seconds()
を使用してください。
Datetime.timedeltaを使用して、あらゆる種類の数学を実行できます。例:
>>> c / 10
datetime.timedelta(0, 0, 431654)
ただし、ウォールクロック時間ではなくCPU時間を調べる方が便利な場合があります...オペレーティングシステムに依存しますが... Unixライクなシステムでは、 'time'コマンドを確認してください。
Python 2.7以降、timedelta.total_seconds()メソッドがあります。したがって、経過したミリ秒を取得するには:
>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077
代わりに timeitモジュール を使用することもできます。
以下も使用できます。
import time
start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)
または、 pythonプロファイラー を使用できます。
私はこれが遅いことを知っていますが、私は実際に使用するのが本当に好きです:
import time
start = time.time()
##### your timed code here ... #####
print "Process time: " + (time.time() - start)
time.time()
は、エポックからの秒数を示します。これは秒単位の標準化された時間であるため、終了時間から開始時間を差し引くだけでプロセス時間(秒単位)を取得できます。 time.clock()
はベンチマークに適していますが、プロセスにかかった時間を知りたい場合は、役に立たないことがわかりました。たとえば、「私のプロセスには10プロセッサクロックユニットかかる」というよりも、「私のプロセスに10秒かかる」と言う方がはるかに直感的です。
>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05
上記の最初の例では、time.clock()の0.05の時間とtime.time()の0.06377の時間が示されています。
>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472
2番目の例では、プロセスが1秒間スリープしていても、何らかの理由でプロセッサ時間が「0」を示しています。 time.time()
は1秒より少し長く正しく表示されます。
単に差を印刷できます:
print tend - tstart
次のコードは、時間の詳細を表示する必要があります...
from datetime import datetime
tstart = datetime.now()
# code to speed test
tend = datetime.now()
print tend - tstart
以下は、Matlab/Octaveのtic
toc
関数を模倣したカスタム関数です。
使用例:
time_var = time_me(); # get a variable with the current timestamp
... run operation ...
time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')
機能:
def time_me(*arg):
if len(arg) != 0:
elapsedTime = time.time() - arg[0];
#print(elapsedTime);
hours = math.floor(elapsedTime / (60*60))
elapsedTime = elapsedTime - hours * (60*60);
minutes = math.floor(elapsedTime / 60)
elapsedTime = elapsedTime - minutes * (60);
seconds = math.floor(elapsedTime);
elapsedTime = elapsedTime - seconds;
ms = elapsedTime * 1000;
if(hours != 0):
print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds))
Elif(minutes != 0):
print ("%d minutes %d seconds" % (minutes, seconds))
else :
print ("%d seconds %f ms" % (seconds, ms))
else:
#print ('does not exist. here you go.');
return time.time()
私はPythonプログラマーではありませんが、 Googleの使用方法は知っています ここで見つけたのは、「-」演算子を使用することです。コードを完成させるには:
from datetime import datetime
tstart = datetime.now()
# code to speed test
tend = datetime.now()
print tend - tstart
さらに、strftime()関数を使用してタイムスパン計算をフォーマットして、時間をレンダリングできるように見えますが、あなたは満足しています。
time.time()/ datetimeはすぐに使用するのに適していますが、必ずしも100%正確ではありません。そのため、私はstd lib profilers (特にhotshot)の1つを使用して、何が何であるかを見つけるのが好きです。
profile モジュールを調べてください。あなたはあなたのスローダウンがどこにあるかをより良く読むことができ、あなたの仕事の多くは完全に自動化されます。
このようなtimeitを使用して、module.pyという名前のスクリプトをテストできます。
$ python -mtimeit -s 'import module'