programing

시간 모듈을 사용하여 경과 시간 측정

sourcetip 2022. 9. 5. 23:36
반응형

시간 모듈을 사용하여 경과 시간 측정

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 이후) 경과 시간의 최선의 측정에 대해서는, 을 사용해 주세요.

성능 카운터 값(단시간 측정 시 사용 가능한 최고 분해능 클럭)을 반환합니다.여기에는 수면 중 경과된 시간이 포함되며 시스템 전체에 걸쳐 있습니다.반환된 값의 기준점이 정의되지 않았기 때문에 연속된 콜 결과의 차이만 유효합니다.

시간/일 순서에 따른 측정의 경우 초 미만의 분해능에 관심이 없으므로 대신 을 사용하십시오.

단조 클럭의 값(단위는 소수)을 반환합니다. 즉, 뒤로 돌아갈 수 없는 클럭입니다.클럭은 시스템클럭 업데이트의 영향을 받지 않는다.반환된 값의 기준점이 정의되지 않았기 때문에 연속된 콜 결과의 차이만 유효합니다.

많은 실장에서는, 실제로는 같은 것이 됩니다.

3.3 이전 버전에서는가 막혀 있습니다.

Unix 에서는, 현재의 프로세서 시간을 초단위로 나타내는 부동 소수점 번호로 반환합니다."프로세서 시간"의 의미에 대한 정밀도 및 실제 정의는 같은 이름의 C 함수의 정의에 따라 달라집니다.

Windows 에서는, 이 함수는 Win32 함수의 Query Performance Counter()에 근거해, 이 함수에의 최초의 호출로부터 경과한 월 클럭 초수를 부동 소수점 번호로 반환합니다.해상도는 보통 1마이크로초보다 우수합니다.


Python 3.7 업데이트

Python 3.7의 새로운 기능은 PEP 564입니다. 나노초 해상도로 새로운 시간 함수를 추가합니다.

이러한 기능을 사용하면 특히 매우 짧은 기간을 측정하거나 애플리케이션(또는 Windows 머신)이 장시간 실행되는 경우 반올림 및 부동 소수점 오류를 제거할 수 있습니다.

해상도가 무너지기 시작하다perf_counter()약 100일 후에.예를 들어 업타임이 1년 경과한 후 측정할 수 있는 최단 간격(0보다 큼)은 시작 시보다 커집니다.


Python 3.8 업데이트

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

그것은 Rutger Hofste의 대답에서 영감을 얻었다.루터 고마워요!

프로그래밍에서는 주로가지 방법으로 시간을 측정할 수 있으며 결과는 다릅니다.

>>> 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에서 실행되는 데 걸리는 시간입니다. 절전, 웹 요청 대기 또는 다른 프로세스만 실행되는 시간은 이 작업에 영향을 미치지 않습니다.

    • 사용하다time.process_time()
  • 벽시계 시간:이는 "벽에 걸려 있는 시계" 즉, 실시간 외부에 얼마나 많은 시간이 경과했는지를 나타냅니다.

    • 사용하다time.perf_counter()

      • time.time()또한 벽시계 시간을 측정하지만 리셋할 수 있으므로 과거로 돌아갈 수 있습니다.
      • time.monotonic()재설정할 수 없지만(초음파 = 앞으로만 진행됨) 정밀도는 보다 낮습니다.time.perf_counter()

현재 시간을 확인하려면 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 

시간을 재는 또 하나의 좋은 방법은 python 구조를 사용하는 것입니다.

structure는 __enter_ 메서드 및 __methods_ 메서드를 자동으로 호출합니다.이것이 바로 타이밍에 필요한 것입니다.

타이머 클래스를 만듭니다.

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, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 107, 127, 131, 137, 131, 139, 149, 151, 151, 163, 163, 173, 171, 191, 191, 191, 191, 191, 191, 191, 191, 191, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 71, 19, 71, 19, 71, 19, 71, 19, 7379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499]

소수점 계산에 소요된 시간: 5.01704216003418ms

바딤 셴더의 반응은 훌륭합니다.다음과 같이 간단한 데코레이터를 사용할 수도 있습니다.

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!")

다음은 Vadim Shender의 현명한 코드와 표 형식의 출력에 대한 업데이트입니다.

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)

언급URL : https://stackoverflow.com/questions/3620943/measuring-elapsed-time-with-the-time-module

반응형