문제
나는 단지 코드 조각의 시간을 측정하려고 노력하고 있습니다.의사코드는 다음과 같습니다:
start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."
파이썬에서는 이것이 어떻게 보일까요?
더 구체적으로, 자정 이후의 틱 수를 어떻게 얻습니까(또는 Python이 해당 타이밍을 구성하는지)?
해결책
에서 time
모듈에는 두 가지 타이밍 기능이 있습니다. time
그리고 clock
. time
이것이 당신이 관심을 갖는 것이라면 "벽"시간을줍니다.
그러나 파이썬 문서 그렇게 말해봐 clock
벤치마킹에 사용해야합니다. 주목하십시오 clock
별도의 시스템에서 다르게 행동합니다.
- MS Windows에서는 Win32 함수 QueryPerformanceCounter ()를 사용하며 "일반적으로 해상도는 마이크로 초보다 낫습니다". 특별한 의미가 없습니다. 단지 숫자 일뿐입니다 (처음으로 전화 할 때 계산을 시작합니다.
clock
당신의 과정에서).
# ms windows t0= time.clock() do_something() t= time.clock() - t0 # t is wall seconds elapsed (floating point)
- on *nix,
clock
CPU 시간을보고합니다. 이제 프로그램이 CPU 시간을 요청하는 유일한 프로세스 (다른 프로세스가 없더라도 커널은 CPU 시간을 사용하고 있음)가 거의 없기 때문에 이것은 다르고 원하는 가치입니다. 따라서 일반적으로 벽 시간보다 작은이 숫자 (예 : time.time -t0)는 코드를 벤치마킹 할 때 더 의미가 있습니다.
# linux t0= time.clock() do_something() t= time.clock() - t0 # t is CPU seconds elapsed (floating point)
그 모든 것 외에도 시간대 모듈에 있습니다 Timer
사용 가능한 기능에서 벤치마킹에 가장 적합한 것을 사용해야하는 클래스.
¹ 스레딩이 방해가되지 않는 한…
² Python ≥3.3 : 있습니다 time.perf_counter()
그리고 time.process_time()
. perf_counter
is being used by the timeit
기준 치수.
다른 팁
당신이 필요로하는 것은 time()
기능 time
기준 치수:
import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."
당신이 사용할 수있는 시간대 그래도 더 많은 옵션을위한 모듈.
최근에 사용하기 시작한 솔루션은 다음과 같습니다.
class Timer:
def __enter__(self):
self.begin = now()
def __exit__(self, type, value, traceback):
print(format_delta(self.begin, now()))
당신은 이것을 사용합니다 (최소한 python 2.5가 필요합니다) :
with Timer():
do_long_code()
코드가 완료되면 타이머가 자동으로 실행 시간을 인쇄합니다. 달콤한! Python 통역사에서 무언가를 신속하게 벤치에 빠르게 벤치하려고한다면 이것이 가장 쉬운 방법입니다.
그리고 다음은 'now'및 'format_delta'의 샘플 구현이 있지만, 선호하는 타이밍 및 서식 방법을 자유롭게 사용하십시오.
import datetime
def now():
return datetime.datetime.now()
# Prints one of the following formats*:
# 1.58 days
# 2.98 hours
# 9.28 minutes # Not actually added yet, oops.
# 5.60 seconds
# 790 milliseconds
# *Except I prefer abbreviated formats, so I print d,h,m,s, or ms.
def format_delta(start,end):
# Time in microseconds
one_day = 86400000000
one_hour = 3600000000
one_second = 1000000
one_millisecond = 1000
delta = end - start
build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day
days = 0
while build_time_us > one_day:
build_time_us -= one_day
days += 1
if days > 0:
time_str = "%.2fd" % ( days + build_time_us / float(one_day) )
else:
hours = 0
while build_time_us > one_hour:
build_time_us -= one_hour
hours += 1
if hours > 0:
time_str = "%.2fh" % ( hours + build_time_us / float(one_hour) )
else:
seconds = 0
while build_time_us > one_second:
build_time_us -= one_second
seconds += 1
if seconds > 0:
time_str = "%.2fs" % ( seconds + build_time_us / float(one_second) )
else:
ms = 0
while build_time_us > one_millisecond:
build_time_us -= one_millisecond
ms += 1
time_str = "%.2fms" % ( ms + build_time_us / float(one_millisecond) )
return time_str
선호하는 서식 메소드가 있거나이 모든 작업을 더 쉬운 방법이 있는지 알려주십시오!
그만큼 시간 모듈 Python에서는 CLOCK () 함수에 액세스 할 수있게되며, 이는 부동 소수점으로 시간을 몇 초 만에 반환합니다.
시스템은 내부 시계 설정 (초당 진드기)을 기준으로 다른 정확도를 가지지 만 일반적으로 적어도 20milliseconds 미만이며 경우에 따라 몇 마이크로 초보다 더 좋습니다.
-아담
import datetime
start = datetime.datetime.now()
do_long_code()
finish = datetime.datetime.now()
delta = finish - start
print delta.seconds
자정부터 :
import datetime
midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
now = datetime.datetime.now()
delta = now - midnight
print delta.seconds
시간을 측정하고 싶은 명령문이 많은 경우 다음과 같이 사용할 수 있습니다.
class Ticker:
def __init__(self):
self.t = clock()
def __call__(self):
dt = clock() - self.t
self.t = clock()
return 1000 * dt
그러면 코드는 다음과 같습니다.
tick = Ticker()
# first command
print('first took {}ms'.format(tick())
# second group of commands
print('second took {}ms'.format(tick())
# third group of commands
print('third took {}ms'.format(tick())
이렇게 하면 입력할 필요가 없습니다. t = time()
각 블록 앞에 1000 * (time() - t)
그 후에는 서식을 계속 제어하면서(쉽게 포맷할 수 있지만) Ticket
도).
최소한의 이득이지만, 좀 편리한 것 같아요.