Python速度テスト-時間差-ミリ秒


136

コードのセクションを高速テストするためにPythonで2回比較する適切な方法は何ですか?APIドキュメントを読んでみました。タイムデルタのことを理解しているのかわかりません。

これまでのところ私はこのコードを持っています:

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

15
なぜt2-t1を印刷しなかったのですか?何があなたを引くのをやめたのですか?
S.Lott、2009

18
たぶん、「そんなに簡単なことはできなかった」瞬間がありました。
BuddyJoe 2009

回答:


191

datetime.timedelta は、2つの日時の違いです...つまり、期間/日/秒/マイクロ秒のようなものです

>>> import datetime
>>> 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.microsecondstimedeltaのマイクロ秒部分のみを返すことに注意してください!タイミングの目的には、常にを使用してくださいc.total_seconds()

次のように、datetime.timedeltaを使用してあらゆる種類の数学を実行できます。

>>> c / 10
datetime.timedelta(0, 0, 431654)

ウォールクロック時間ではなくCPU時間を確認する方が便利かもしれませんが、これはオペレーティングシステムに依存しますが、Unixのようなシステムでは、「time」コマンドを確認してください。


int(c.total_seconds() / 60)この場合、合計時間を取得することに関心がある人なら誰でも使用できます
sufinawaz

2
timeitモジュールページには、モジュールが「実行時間を測定するための多くの一般的なトラップを回避する」と記載されています。この方法(datetime.nowを使用)は、これらの落とし穴の影響を受けますか?
kuzzooroo 2015

@kuzzoorooはい、そうです!このメソッドの代わりにtimeitを使用することをお勧めします!たとえば、大規模なpythonプロジェクトでテストを行っていますが、このメソッドを使用して測定すると、想定される0.25秒のランタイムになります。実際には、timeitによると、この関数の実行時間は実際には30秒です。
kazaamjt

62

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


20

あなたも使うことができます:

import time

start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)

または、Pythonプロファイラーを使用することもできます。


1
使用start = time.clock()時は印刷しDeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time insteadます。
Contango

16

私はこれが遅いことを知っていますが、私は実際に使用するのが本当に好きです:

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秒強を示しています。


NameError:名前「time」は定義されていません
Joe

import timeステートメントが必要
mgoldwasser '31年

5

次のコードは、時間の詳細を表示する必要があります...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

4

あなたは単に違いを印刷することができます:

print tend - tstart

4

私はPythonプログラマではありませんが、Googleの使い方は知っています。私が見つけたのは、「-」演算子を使用することです。コードを完成させるには:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

さらに、strftime()関数を使用してタイムスパン計算をフォーマットし、時間をレンダリングできるように見えますが、満足しています。


質問レベルの2番目のコメントを参照してください。
BuddyJoe 2009

15
「しかし、私はGoogleの使い方を知っています」-スタックオーバーフローの使い方はわからないようです。なぜなら、このWebサイトの目的はすべて、人々がプログラミングの質問を正しい質問に答えることであり、 「代わりにゴーグルを使うことができた」ということについてスナークを与える。
Hejazzman、2015

2

time.time()/ datetimeは迅速に使用するのに適していますが、必ずしも100%正確であるとは限りません。そのため、私はstd lib プロファイラー(特にホットショット)の1つを使用して、何が何であるかを調べたいと思っています。



2

以下は、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()

トレースバック(最新の呼び出しは最後):ファイル「redis-get-response.py」、22行目、<module>内time_var = time_me(); #現在のタイムスタンプを持つ変数を取得ファイル "redis-get-response.py"、20行目、time_meでreturn time.time()NameError:name 'time' is not defined
Joe

0

このようなtimeitを使用して、module.pyという名前のスクリプトをテストできます。

$ python -mtimeit -s 'import module'

0

矢印:Pythonの日付と時刻の改善

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.