문제

나는 단지 코드 조각의 시간을 측정하려고 노력하고 있습니다.의사코드는 다음과 같습니다:

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 도).

최소한의 이득이지만, 좀 편리한 것 같아요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top