파이썬에서 코드 줄 사이에 걸리는 시간을 측정하는 방법은 무엇입니까?


101

그래서 Java에서는 함수가 실행하는 데 걸리는 시간을 측정하는 방법을 할 수 있습니다.

그러나 파이썬에서는 어떻게 이루어 집니까? 코드 줄 사이의 시작 및 종료 시간을 측정하려면? 이것을하는 것 :

import some_time_library

starttime = some_time_library.some_module()
code_tobe_measured() 
endtime = some_time_library.some_module()

time_taken = endtime - starttime

답변:


159

CPU 시간을 측정하려면 time.process_time()Python 3.3 이상에서 사용할 수 있습니다 .

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)

첫 번째 전화는 타이머를 켜고 두 번째 전화는 몇 초가 경과했는지 알려줍니다.

함수도 time.clock()있지만 Python 3.3부터 사용되지 않으며 Python 3.8에서 제거됩니다.

이 더 나은 프로파일 링 도구처럼 timeit하고 profiletime.process_time 그러나, () CPU 시간을 측정하고이 당신에 대해 요구하고있는 것입니다 것입니다.

대신 벽시계 시간을 측정하려면을 사용하십시오 time.time().


53
이것은 당신이 어떻게 사용되지 않습니다 time.clock(), 및 time.clock()Windows에서 유닉스에 대한 조치 CPU 시간 만 월 시간. time.time()OS에 따라 동작이 다르지 않은 곳 에서 사용 하는 것이 좋습니다 . stackoverflow.com/questions/85451/…
Tim

4
좋은 관찰, @Tim. 그러나 동일한 질문에 대한 또 다른 게시물은 "이것은 Python 또는 타이밍 알고리즘을 벤치마킹하는 데 사용할 함수입니다"라는 time.clock ()의 ​​python doc을 인용합니다. 실제로 측정하고 싶은 것이 무엇인지에 대한 질문에 해당한다고 생각합니다.
Yevgen Yampolskiy

1
time.time ()에 대한 아주 나쁜 점은 그것이 time sunchronization ntpdate 등에 의해 영향을 받는다는 것입니다. 나는 time.clock ()이 이것 때문에 유일한 믿을만한 대안이라고 말할 것입니다
www.jensolsson.se

4
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
ismailarilik

2
흠 ... 내가 뭘 잘못하고 있는지 잘 모르겠어. 나는 대체 # your code heretime.sleep(10)0.0 초를 얻었다. 추가 for i in range(10000):/pass하면 동일한 결과가 생성되었습니다. 내가 시도한 어떤 상황에서도 time.process_time()항상 같은 숫자를 반환합니다. 내가 사용하는 결과를 예상있어 time.perf_counter()하지만
biscuit314

58

time라이브러리를 사용할 수도 있습니다 .

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')

1
@Hayat-이 메서드는 시간을 UTC로 epoch 이후 초 단위로 표현 된 부동 소수점 숫자로 반환합니다. [ docs.python.org/3/library/time.html]
Anumoy Sutradhar 19

@AnumoySutradhar는 실제로는 시대에서 시대를 빼기 때문에 두 시간 사이의 시간 차이를 얻습니다.
Nasta

28

작은 편의 클래스의 도움으로 다음 과 같이 들여 쓰기 된 줄에 소요 된 시간을 측정 할 수 있습니다 .

with CodeTimer():
   line_to_measure()
   another_line()
   # etc...

들여 쓴 줄이 실행을 마친 후 다음과 같이 표시됩니다.

Code block took: x.xxx ms

업데이트 : 이제와 클래스를 얻을 수 있습니다 pip install linetimerfrom linetimer import CodeTimer. 이 GitHub 프로젝트를 참조하십시오 .

위 클래스의 코드 :

import timeit

class CodeTimer:
    def __init__(self, name=None):
        self.name = " '"  + name + "'" if name else ''

    def __enter__(self):
        self.start = timeit.default_timer()

    def __exit__(self, exc_type, exc_value, traceback):
        self.took = (timeit.default_timer() - self.start) * 1000.0
        print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')

그런 다음 측정하려는 코드 블록의 이름을 지정할 수 있습니다.

with CodeTimer('loop 1'):
   for i in range(100000):
      pass

with CodeTimer('loop 2'):
   for i in range(100000):
      pass

Code block 'loop 1' took: 4.991 ms
Code block 'loop 2' took: 3.666 ms

그리고 그들을 중첩하십시오 .

with CodeTimer('Outer'):
   for i in range(100000):
      pass

   with CodeTimer('Inner'):
      for i in range(100000):
         pass

   for i in range(100000):
      pass

Code block 'Inner' took: 2.382 ms
Code block 'Outer' took: 10.466 ms

에 관해서 timeit.default_timer()는 OS 및 Python 버전에 따라 최고의 타이머를 사용합니다 . 이 답변을 참조하십시오 .


11

나는 항상 시간, 분, 초 (% H : % M : % S) 형식으로 시간을 확인하는 것을 선호합니다.

from datetime import datetime
start = datetime.now()
# your code
end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 

산출:

Time:  0:00:00.000019

3

최소한의 코드로 형식이 지정된 시간을 출력하는 방법을 찾고 있었으므로 여기에 내 솔루션이 있습니다. 어쨌든 많은 사람들이 Pandas를 사용하므로 경우에 따라 추가 라이브러리 가져 오기에서 절약 할 수 있습니다.

import pandas as pd
start = pd.Timestamp.now()
# code
print(pd.Timestamp.now()-start)

산출:

0 days 00:05:32.541600

시간 정밀도가 가장 중요하지 않은 경우 이것을 사용하는 것이 좋습니다. 그렇지 않으면 time라이브러리를 사용하십시오 .

%timeit pd.Timestamp.now() 루프 당 3.29 µs ± 214 ns 출력

%timeit time.time() 루프 당 154ns ± 13.3ns 출력


3

코드를 함수에 넣은 다음 타이밍을 위해 데코레이터를 사용하는 것도 또 다른 옵션입니다. ( Source )이 방법의 장점은 타이머를 한 번 정의 하고 모든 함수에 대해 간단한 추가 라인 과 함께 사용한다는 것입니다 .

먼저 timer데코레이터를 정의합니다 .

import functools
import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3)))
        return value

    return wrapper

그런 다음 함수를 정의하는 동안 데코레이터를 사용합니다.

@timer
def doubled_and_add(num):
    res = sum([i*2 for i in range(num)])
    print("Result : {}".format(res))

해보자:

doubled_and_add(100000)
doubled_and_add(1000000)

산출:

Result : 9999900000
Finished 'doubled_and_add' in 0.0119 secs
Result : 999999000000
Finished 'doubled_and_add' in 0.0897 secs

참고 : time.perf_counter대신 time.time. 의견을 환영합니다.


1

이것도 시도해 볼 수 있습니다.

from time import perf_counter

t0 = perf_counter()

...

t1 = perf_counter()
time_taken = t1 - t0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.