[python] 파이썬에서 경과 시간을 측정하는 방법?

내가 원하는 것은 내 코드 어딘가에서 시간을 계산 한 다음 전달 된 시간을 가져와 거의 기능을 실행하는 데 걸리는 시간을 측정하는 것입니다. timeit 모듈을 잘못 사용하고 있다고 생각하지만 문서가 혼란 스럽습니다.

import timeit

start = timeit.timeit()
print("hello")
end = timeit.timeit()
print(end - start)



답변

두 지점 사이의 경과 된 벽시계 시간을 측정하려는 경우 다음을 사용할 수 있습니다 time.time().

import time

start = time.time()
print("hello")
end = time.time()
print(end - start)

실행 시간 (초)을 제공합니다.

3.3 이후 또 다른 옵션은 사용할 수 있습니다 perf_counter또는 process_time귀하의 요구 사항에 따라. 3.3 전에 그것을 사용을 권장했다 time.clock(감사 황색 ). 그러나 현재 더 이상 사용되지 않습니다.

유닉스에서는 현재 프로세서 시간을 부동 소수점 숫자 (초)로 반환합니다. “프로세서 시간”의 의미에 대한 정확성과 정의는 같은 이름의 C 함수의 정밀도에 따라 달라집니다.

Windows에서이 함수는 Win32 함수를 기반으로이 함수를 처음 호출 한 후 경과 된 벽시계 초를 부동 소수점 숫자로 리턴합니다 QueryPerformanceCounter(). 해상도는 일반적으로 1 마이크로 초보다 낫습니다.

버전 3.3부터 사용되지 않음 :이 기능의 동작은 플랫폼 에 따라 다릅니다. 요구 사항에 따라 또는 대신을 사용perf_counter()process_time() 하여 올바르게 정의 된 동작을 수행하십시오.


답변

timeit.default_timer대신에 사용하십시오 timeit.timeit. 전자는 플랫폼 및 Python 버전에서 자동으로 사용할 수있는 최고의 시계를 자동으로 제공합니다.

from timeit import default_timer as timer

start = timer()
# ...
end = timer()
print(end - start) # Time in seconds, e.g. 5.38091952400282

timeit.default_timer 는 OS에 따라 time.time () 또는 time.clock ()에 할당됩니다. Python 3.3 이상에서 default_timer 는 모든 플랫폼에서 time.perf_counter () 입니다. Python-time.clock () 대 time.time ()-정확도를 참조하십시오 .

또한보십시오:


답변

파이썬 3 만 :

time.clock ()이 때문에 파이썬 3.3으로 사용되지 않습니다 , 당신은 사용하고자하는 것입니다 time.perf_counter()시스템 전체의 타이밍, 또는 time.process_time()공정 전체의 타이밍, 당신이 사용하는 데 사용 단지 방법을 time.clock():

import time

t = time.process_time()
#do some stuff
elapsed_time = time.process_time() - t

새로운 기능 process_time은 수면 중에 경과 된 시간을 포함하지 않습니다.


답변

시간을 내고 싶은 기능이 있다면

test.py :

def foo():
    # print "hello"   
    return "hello"

사용하는 가장 쉬운 방법 timeit은 명령 줄에서 호출하는 것입니다.

% python -mtimeit -s'import test' 'test.foo()'
1000000 loops, best of 3: 0.254 usec per loop

기능 속도를 비교 하기 위해 time.time또는 time.clock(순진하게) 사용하지 마십시오 . 그들은 잘못된 결과를 줄 수 있습니다 .

추신. 인쇄하고자하는 함수에 인쇄 문을 넣지 마십시오. 그렇지 않으면 측정 된 시간 은 터미널 속도에 따라 달라집니다 .


답변

콘텍스트 관리자를 사용하여이 작업을 수행하는 것이 재미있다. with블록 블록 종료시 종료 시간을 고정 있습니다. 약간의 속임수를 사용하면 동일한 컨텍스트 관리자 기능으로 블록 내에서 경과 시간 집계를 얻을 수도 있습니다.

핵심 라이브러리에는 이것이 없지만 아마도 있어야합니다. 제 위치에 있으면 다음과 같은 작업을 수행 할 수 있습니다.

with elapsed_timer() as elapsed:
    # some lengthy code
    print( "midpoint at %.2f seconds" % elapsed() )  # time so far
    # other lengthy code

print( "all done at %.2f seconds" % elapsed() )

트릭을 수행하기에 충분한 컨텍스트 관리자 코드는 다음과 같습니다 .

from contextlib import contextmanager
from timeit import default_timer

@contextmanager
def elapsed_timer():
    start = default_timer()
    elapser = lambda: default_timer() - start
    yield lambda: elapser()
    end = default_timer()
    elapser = lambda: end-start

그리고 실행 가능한 데모 코드 :

import time

with elapsed_timer() as elapsed:
    time.sleep(1)
    print(elapsed())
    time.sleep(2)
    print(elapsed())
    time.sleep(3)

이 함수의 설계 elapsed()에 따라 블록 종료시 리턴 값 이 고정되고 추가 호출은 동일한 지속 시간 (이 장난감 예에서는 약 6 초)을 리턴합니다.


답변

초 단위의 측정 시간 :

from timeit import default_timer as timer
from datetime import timedelta

start = timer()
end = timer()
print(timedelta(seconds=end-start))

출력 :

0:00:01.946339


답변

나는 이것을 선호한다. timeit문서가 너무 혼란 스럽다.

from datetime import datetime

start_time = datetime.now()

# INSERT YOUR CODE 

time_elapsed = datetime.now() - start_time

print('Time elapsed (hh:mm:ss.ms) {}'.format(time_elapsed))

여기서 진행중인 서식이 없으며 hh:mm:ss, 인쇄물에 썼기 때문에 해석 할 수 있습니다.time_elapsed