파이썬 속도 테스트-시차-밀리 초


136

코드 섹션을 빠르게 테스트하기 위해 Python에서 2 번 비교하는 적절한 방법은 무엇입니까? API 문서를 읽으려고했습니다. 타임 델타를 이해하지 못합니다.

지금 까지이 코드가 있습니다.

from datetime import datetime

tstart = datetime.now()
print t1

# code to speed test

tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here

15
t2-t1을 인쇄하지 않은 이유는 무엇입니까? 무엇을 빼지 못하게 했습니까?
S.Lott

18
나는 "쉽지 않을"순간을 가졌다 고 생각한다.
BuddyJoe 2009

답변:


191

datetime.timedelta 두 datetime의 차이점입니다 ... 일 / 초 / 마이크로 초의 기간과 같습니다.

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a

>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543

c.microseconds타임 델타의 마이크로 초 부분 만 반환 한다는 점에 유의하십시오 ! 타이밍 목적으로 항상을 사용하십시오 c.total_seconds().

datetime.timedelta를 사용하여 모든 종류의 수학을 수행 할 수 있습니다. 예 :

>>> c / 10
datetime.timedelta(0, 0, 431654)

유닉스 계열 시스템에서는 ...하지만 운영 체제에 따라 다르지만 월 클럭 시간 대신 CPU 시간을 보는 것이 더 유용 할 수 있습니다.


총 시간을 얻는 데 관심이있는 사람 int(c.total_seconds() / 60)은이 경우에 사용할 수 있습니다
sufinawaz

2
timeit 모듈페이지 는 모듈이 "실행 시간을 측정하기위한 많은 일반적인 트랩을 피합니다"라고 말합니다. 이 접근법 (datetime.now 사용)이 그러한 함정에 종속됩니까?
kuzzooroo 2019

@kuzzooroo 네, 그렇습니다! 이 방법 대신 timeit을 사용하는 것이 좋습니다! 예를 들어,이 방법을 사용하여 측정 할 때 0.25 초의 런타임이 발생하는 큰 파이썬 프로젝트에서 테스트를했습니다. 실제로, timeit에 따르면, 상기 기능의 실행 시간은 실제로 30 초입니다!
kazaamjt

62

파이썬 2.7부터 timedelta.total_seconds () 메소드가 있습니다. 따라서 경과 된 밀리 초를 얻으려면 :

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077


20

다음을 사용할 수도 있습니다.

import time

start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)

또는 파이썬 프로파일 러를 사용할 수 있습니다 .


1
사용 start = time.clock()하면 인쇄 DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead됩니다.
콘 탄고

16

나는 이것이 늦다는 것을 알고 있지만 실제로는 다음을 사용하는 것을 정말로 좋아합니다.

import time
start = time.time()

##### your timed code here ... #####

print "Process time: " + (time.time() - start)

time.time()에포크 이후 몇 초를 제공합니다. 이 시간은 초 단위의 표준화 된 시간이므로 종료 시간에서 시작 시간을 빼서 프로세스 시간 (초)을 얻을 수 있습니다. time.clock()벤치마킹에는 좋지만 프로세스 소요 시간을 알고 싶다면 쓸모가 없다는 것을 알았습니다. 예를 들어 "프로세스는 10 개의 프로세서 클럭 단위를 사용합니다"라는 것보다 "프로세스는 10 초가 걸립니다"라고 말하는 것이 훨씬 직관적입니다.

>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05

위의 첫 번째 예에서 time.clock ()의 ​​경우 0.05와 time.time ()의 경우 0.06377의 시간이 표시됩니다.

>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472

두 번째 예에서는 프로세스가 1 초 동안 잤더라도 프로세서 시간에 "0"이 표시됩니다. time.time()1 초보다 조금 더 정확하게 표시합니다.


NameError : 이름 '시간'이 정의되지 않았습니다
Joe

당신은 import time진술 이 필요합니다
mgoldwasser

5

다음 코드는 시간을 표시해야합니다 ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

4

차이점을 간단히 인쇄 할 수 있습니다.

print tend - tstart

4

저는 Python 프로그래머는 아니지만 Google 사용법을 알고 있으며 여기에 내가 찾은 것이 있습니다 : "-"연산자를 사용하십시오. 코드를 완성하려면

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

또한 strftime () 함수를 사용하여 시간을 계산하기 위해 시간 범위 계산의 형식을 지정할 수 있지만 행복해집니다.


질문 수준에서 두 번째 주석을 참조하십시오.
BuddyJoe 2009

15
"하지만 Google 사용법을 알고 있습니다."-이 웹 사이트의 전체 목적은 사람들이 프로그래밍 질문에 정확하고 정확하게 대답하기위한 것이기 때문에 Stack Overflow를 사용하는 방법을 모르는 것 같습니다. "대신 고글을했을 수있는 방법"에 대해
Hejazzman

2

time.time () / datetime은 빠른 사용에는 좋지만 항상 100 % 정확하지는 않습니다. 이런 이유로 std lib 프로파일 러 중 하나 (특히 핫샷)를 사용하여 무엇이 무엇인지 알고 싶습니다 .


2

프로필 모듈 을 살펴볼 수 있습니다 . 속도 저하 위치를 더 잘 읽을 수 있으며 대부분의 작업이 완전 자동화됩니다.


2

Matlab / Octave의 tic toc기능 을 모방 한 사용자 정의 기능은 다음과 같습니다 .

사용 예 :

time_var = time_me(); # get a variable with the current timestamp

... run operation ...

time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')

함수 :

def time_me(*arg):
    if len(arg) != 0: 
        elapsedTime = time.time() - arg[0];
        #print(elapsedTime);
        hours = math.floor(elapsedTime / (60*60))
        elapsedTime = elapsedTime - hours * (60*60);
        minutes = math.floor(elapsedTime / 60)
        elapsedTime = elapsedTime - minutes * (60);
        seconds = math.floor(elapsedTime);
        elapsedTime = elapsedTime - seconds;
        ms = elapsedTime * 1000;
        if(hours != 0):
            print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
        elif(minutes != 0):
            print ("%d minutes %d seconds" % (minutes, seconds))
        else :
            print ("%d seconds %f ms" % (seconds, ms))
    else:
        #print ('does not exist. here you go.');
        return time.time()

역 추적 (가장 최근 호출) : <모듈>의 22 행 "redis-get-response.py"파일 time_var = time_me (); # time_me에서 현재 타임 스탬프 파일 "redis-get-response.py", 20 행에 변수를 가져옵니다. return time.time () NameError : name 'time'is not defined
Joe

0

이와 같은 timeit을 사용하여 module.py라는 스크립트를 테스트 할 수 있습니다.

$ python -mtimeit -s 'import module'

0

Arrow : 파이썬을위한 더 나은 날짜와 시간

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.