PythonのTimeモジュールを使えば、経過時間を測定できますか?もしそうなら、どのように私はそれをするのですか?
これを行う必要があるのは、カーソルが一定期間ウィジェット内にあるとイベントが発生するようにするためです。
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()を呼び出すだけです。
time.time()
が仕事をします。
import time
start = time.time()
# run your code
end = time.time()
elapsed = end - start
あなたは この の質問を見たいと思うかもしれませんが、私はそれが必要になるとは思わない。
より良いフォーマットを望むユーザーのために、
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 のドキュメント
経過時間の最良の尺度(Python 3.3以降)を得るには、 time.perf_counter()
を使用してください。
パフォーマンスカウンタの値(小数秒単位)を返します。つまり、短い期間を測定するために、利用可能な最も高い解像度のクロックです。これは、睡眠中に経過した時間を含み、システム全体です。戻り値の参照点は未定義であるため、連続した呼び出しの結果の違いだけが有効です。
時間/日のオーダーの測定では、1秒未満の分解能は気にしないので、代わりに time.monotonic()
を使用してください。
単調クロック、つまり逆方向に進むことができないクロックの値(小数秒単位)を返します。クロックはシステムクロックの更新による影響を受けません。戻り値の参照点は未定義であるため、連続した呼び出しの結果の違いだけが有効です。
多くの実装では、これらは実際には同じものです。
3.3より前では、 time.clock()
で行き詰まっています。
Unixでは、現在のプロセッサ時間を秒単位の浮動小数点数として返します。精度、そして実際には「プロセッサ時間」の意味の定義そのものは、同じ名前のC関数の精度に依存します。
Windowsでは、この関数は、Win32関数QueryPerformanceCounter()に基づいて、この関数を最初に呼び出してから経過した実時間を浮動小数点数として返します。分解能は通常1マイクロ秒より優れています。
Python 3.7の新機能は、 PEP 564 です。 - ナノ秒の分解能で新しい時間関数を追加します。
これらを使用すると、特に非常に短い期間を測定している場合、またはアプリケーション(またはWindowsマシン)が長時間実行されている場合に、丸めエラーと浮動小数点エラーをさらに排除できます。
約100日後にperf_counter()
で解決が始まります。そのため、たとえば1年の稼働時間が過ぎると、測定可能な最短の間隔(0より大きい)は開始時よりも長くなります。
時間をインポートしてから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
長期間です。
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の答えに触発されました。ラトガーありがとう!
時間を調整するもう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
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!")