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.__name__ 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マイクロ秒よりも優れています。
Python3.7の新機能はPEP564です-ナノ秒の解像度で新しい時間関数を追加します。
これらを使用すると、特に非常に短い期間を測定している場合、またはアプリケーション(またはWindowsマシン)が長時間実行されている場合に、丸めおよび浮動小数点エラーをさらに排除できます。
perf_counter()
解決は約100日後に崩壊し始めます。したがって、たとえば1年の稼働時間の後、測定できる最短の間隔(0より大きい)は、開始時よりも大きくなります。
time.clock
今はなくなっています。
長期間。
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
それはRutgerHofsteの答えに触発されています。ラトガーありがとう!
時刻をインポートしてから、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
プログラミングでは、時間を測定する主な方法が2つあり、結果は異なります。
>>> print(time.process_time()); time.sleep(10); print(time.process_time())
0.11751394000000001
0.11764988400000001 # took 0 seconds and a bit
>>> print(time.perf_counter()); time.sleep(10); print(time.perf_counter())
3972.465770326
3982.468109075 # took 10 seconds and a bit
プロセッサ時間:これは、この特定のプロセスがCPUでアクティブに実行されるのに費やす時間です。スリープ、Web要求の待機、または他のプロセスのみが実行される時間は、これに寄与しません。
time.process_time()
壁時計時間:これは、「壁に掛かっている時計」、つまりリアルタイムの外で経過した時間を指します。
使用するtime.perf_counter()
time.time()
実時間も測定しますが、リセットできるので、時間を遡ることができますtime.monotonic()
リセットできません(単調=進むだけです)が、精度はtime.perf_counter()
時間を計るもう1つの良い方法は、withpython構造を使用することです。
with structureは、自動的に__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
VadimShenderの反応は素晴らしいです。以下のような単純なデコレータを使用することもできます。
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!")
表形式の出力を使用したVadimShenderの巧妙なコードの更新は次のとおりです。
import collections
import time
from functools import wraps
PROF_DATA = collections.defaultdict(list)
def profile(fn):
@wraps(fn)
def with_profiling(*args, **kwargs):
start_time = time.time()
ret = fn(*args, **kwargs)
elapsed_time = time.time() - start_time
PROF_DATA[fn.__name__].append(elapsed_time)
return ret
return with_profiling
Metrics = collections.namedtuple("Metrics", "sum_time num_calls min_time max_time avg_time fname")
def print_profile_data():
results = []
for fname, elapsed_times in PROF_DATA.items():
num_calls = len(elapsed_times)
min_time = min(elapsed_times)
max_time = max(elapsed_times)
sum_time = sum(elapsed_times)
avg_time = sum_time / num_calls
metrics = Metrics(sum_time, num_calls, min_time, max_time, avg_time, fname)
results.append(metrics)
total_time = sum([m.sum_time for m in results])
print("\t".join(["Percent", "Sum", "Calls", "Min", "Max", "Mean", "Function"]))
for m in sorted(results, reverse=True):
print("%.1f\t%.3f\t%d\t%.3f\t%.3f\t%.3f\t%s" % (100 * m.sum_time / total_time, m.sum_time, m.num_calls, m.min_time, m.max_time, m.avg_time, m.fname))
print("%.3f Total Time" % total_time)