web-dev-qa-db-ja.com

Timeモジュールで経過時間を測定する

PythonのTimeモジュールを使えば、経過時間を測定できますか?もしそうなら、どのように私はそれをするのですか?

これを行う必要があるのは、カーソルが一定期間ウィジェット内にあるとイベントが発生するようにするためです。

275
rectangletangle
start_time = time.time()
# your code
elapsed_time = time.time() - start_time

さまざまな関数の実行時間の測定を簡単にするために、単純なデコレータを書くこともできます。

import time
from functools import wraps

PROF_DATA = {}

def profile(fn):
    @wraps(fn)
    def with_profiling(*args, **kwargs):
        start_time = time.time()

        ret = fn(*args, **kwargs)

        elapsed_time = time.time() - start_time

        if fn.__not in PROF_DATA:
            PROF_DATA[fn.__name__] = [0, []]
        PROF_DATA[fn.__name__][0] += 1
        PROF_DATA[fn.__name__][1].append(elapsed_time)

        return ret

    return with_profiling

def print_prof_data():
    for fname, data in PROF_DATA.items():
        max_time = max(data[1])
        avg_time = sum(data[1]) / len(data[1])
        print "Function %s called %d times. " % (fname, data[0]),
        print 'Execution time max: %.3f, average: %.3f' % (max_time, avg_time)

def clear_prof_data():
    global PROF_DATA
    PROF_DATA = {}

使用法:

@profile
def your_function(...):
    ...

同時に複数の機能をプロファイルできます。それから測定値を印刷するには、print_prof_data()を呼び出すだけです。

427
Vadim Shender

time.time()が仕事をします。

import time

start = time.time()
# run your code
end = time.time()

elapsed = end - start

あなたは この の質問を見たいと思うかもしれませんが、私はそれが必要になるとは思わない。

88
lalli

より良いフォーマットを望むユーザーのために、

import time
start_time = time.time()
# your script
elapsed_time = time.time() - start_time
time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

2秒間プリントアウトします。

'00:00:02'

そして7分間1秒間:

'00:07:01'

gmtimeの最小時間単位は秒です。マイクロ秒が必要な場合は、次の点を考慮してください。

import datetime
start = datetime.datetime.now()
# some code
end = datetime.datetime.now()
elapsed = end - start
print(elapsed)
# or
print(elapsed.seconds,":",elapsed.microseconds) 

strftime のドキュメント

49
Rutger Hofste

経過時間の最良の尺度(Python 3.3以降)を得るには、 time.perf_counter() を使用してください。

パフォーマンスカウンタの値(小数秒単位)を返します。つまり、短い期間を測定するために、利用可能な最も高い解像度のクロックです。これは、睡眠中に経過した時間を含み、システム全体です。戻り値の参照点は未定義であるため、連続した呼び出しの結果の違いだけが有効です。

時間/日のオーダーの測定では、1秒未満の分解能は気にしないので、代わりに time.monotonic() を使用してください。

単調クロック、つまり逆方向に進むことができないクロックの値(小数秒単位)を返します。クロックはシステムクロックの更新による影響を受けません。戻り値の参照点は未定義であるため、連続した呼び出しの結果の違いだけが有効です。

多くの実装では、これらは実際には同じものです。

3.3より前では、 time.clock() で行き詰まっています。

Unixでは、現在のプロセッサ時間を秒単位の浮動小数点数として返します。精度、そして実際には「プロセッサ時間」の意味の定義そのものは、同じ名前のC関数の精度に依存します。

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


Python 3.7用のアップデート

Python 3.7の新機能は、 PEP 564 です。 - ナノ秒の分解能で新しい時間関数を追加します。

これらを使用すると、特に非常に短い期間を測定している場合、またはアプリケーション(またはWindowsマシン)が長時間実行されている場合に、丸めエラーと浮動小数点エラーをさらに排除できます。

約100日後にperf_counter()で解決が始まります。そのため、たとえば1年の稼働時間が過ぎると、測定可能な最短の間隔(0より大きい)は開始時よりも長くなります。

31
OrangeDog

時間をインポートしてからtime.time()メソッドを使用して現在の時間を知る必要があります。

import time

start_time=time.time() #taking current time as starting time

#here your code

elapsed_time=time.time()-start_time #again taking current time - starting time 
6

長期間です。

import time
start_time = time.time()
...
e = int(time.time() - start_time)
print('{:02d}:{:02d}:{:02d}'.format(e // 3600, (e % 3600 // 60), e % 60))

印刷する

00:03:15

24時間以上の場合

25:33:57

それはRutger Hofsteの答えに触発されました。ラトガーありがとう!

5
Tora

時間を調整するもう1つの良い方法は、with python構造を使用することです。

with構造は自動的に呼び出します_ ENTER _および_ EXIT _正確に時間を計るために必要なメソッドです。

Timerクラスを作成しましょう。

from time import time

class Timer():
    def __init__(self, message):
        self.message = message
    def __enter__(self):
        self.start = time()
        return None  # could return anything, to be used like this: with Timer("Message") as value:
    def __exit__(self, type, value, traceback):
        elapsed_time = (time() - self.start) * 1000
        print(self.message.format(elapsed_time))

次に、次のようにTimerクラスを使用できます。

with Timer("Elapsed time to compute some prime numbers: {}ms"):
    primes = []
    for x in range(2, 500):
        if not any(x % p == 0 for p in primes):
            primes.append(x)
    print("Primes: {}".format(primes))

結果は次のとおりです。

プライム:[2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89 、97、101、103、107、109、113、127、131、137、139、149、151、157、163、167、173、179、181、191、193、197、199、211、223、227 、229、233、239、241、251、257、263、269、271、277、281、283、293、307、311、313、317、331、337、347、349、353、359、367、373 、379、383、389、397、401、409、419、421、431、433、439、443、449、457、461、463、467、479、487、491、499]

いくつかの素数を計算するための経過時間:5.01704216003418ms

1
T.M.

Vadim Shenderの回答は素晴らしいです。以下のようなもっと単純なデコレータを使うこともできます。

import datetime
def calc_timing(original_function):                            
    def new_function(*args,**kwargs):                        
        start = datetime.datetime.now()                     
        x = original_function(*args,**kwargs)                
        elapsed = datetime.datetime.now()                      
        print("Elapsed Time = {0}".format(elapsed-start))     
        return x                                             
    return new_function()  

@calc_timing
def a_func(*variables):
    print("do something big!")
1
Mohammad