368

PythonのTimeモジュールを使用して、経過時間を測定することは可能ですか?もしそうなら、どうすればいいですか?

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

4

10 に答える 10

549
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()を呼び出すだけです。

于 2010-09-01T18:22:03.440 に答える
97

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

import time

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

elapsed = end - start

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

于 2010-09-01T18:28:25.003 に答える
90

より良いフォーマットが必要なユーザーのために、

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ドキュメント

于 2017-10-03T12:04:17.627 に答える
63

経過時間の最良の測定値(Python 3.3以降)には、を使用しますtime.perf_counter()

パフォーマンスカウンターの値(秒単位)を返します。つまり、短時間を測定するために利用可能な最高の解像度の時計を返します。これには、スリープ中に経過した時間が含まれ、システム全体に適用されます。戻り値の基準点は未定義であるため、連続した呼び出しの結果の差のみが有効です。

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

単調な時計、つまり逆方向に移動できない時計の値(秒単位)を返します。クロックは、システムクロックの更新の影響を受けません。戻り値の基準点は未定義であるため、連続した呼び出しの結果の差のみが有効です。

多くの実装では、これらは実際には同じものである可能性があります。

3.3より前では、あなたはで立ち往生していtime.clock()ます。

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

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


Python3.7のアップデート

Python3.7の新機能はPEP564です-ナノ秒の解像度で新しい時間関数を追加します。

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

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


Python3.8のアップデート

time.clock今はなくなっています。

于 2017-12-04T16:34:02.497 に答える
8

長期間。

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の答えに触発されています。ラトガーありがとう!

于 2018-03-18T17:24:30.950 に答える
6

時刻をインポートしてから、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 
于 2016-03-10T23:33:53.907 に答える
6

プログラミングでは、時間を測定する主な方法が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()
于 2020-05-31T11:51:39.190 に答える
4

時間を計るもう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

于 2019-06-25T08:16:52.917 に答える
2

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!")
于 2018-10-17T04:18:16.443 に答える
0

表形式の出力を使用した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)
于 2019-09-27T13:27:52.797 に答える