[파이썬] Python 코드 실행시간(시:분:초) 측정 방법: process_time(), perf_counter(),default_timer(),time(), timedelta()
개발을 하다보면 소스 코드들 중 어느 부분에서 동작 시간이 오래 걸리는지 체크해야할 때가 있어요. 어느 부분에서 오래 걸리는지를 체크해서 코드 리팩토링과 같은 작업을 하거나 오래걸리는 부분의 코드를 체크해서 원인 파악을 위해서 필요할 때가 있습니다. 자주 사용하지는 않지만 알고 있으면 좋겠죠??
파이썬에서 코드 실행시간을 측정하는 방법은 time 모듈을 사용허가나 timeit를 사용하여 측정 할 수 있습니다.
아래 코드 스니펫의 예제에서 처럼 함수를 호출할때 시작시간을 체크하고 종료시점에 종료시간을 체크 후 계산해줍니다. datetime 모듈을 사용하여 시분초로 표기할 수 있습니다.
#timechecksample.py
import time import datetime import timeit def sample1(): start_time = time.time() tot = 0 for i in range(10000): tot = tot + i print("sample1 총합:", tot) end_time = time.time() print("sample1 실행시간(초): ", end_time-start_time) def sample2(): start_time2 = time.time() tot2 = 0 for i in range(100000000): tot2 = tot2 + i print("\nsample2 총합:", tot2) end_time2 = time.time() print("sample2 실행시간(초): ", end_time2 - start_time2) def sample_datetime(): start_time3 = time.time() tot3 = 0 for i in range(100000000): tot3 = tot3 + i print("\nsample_datetime 총합:", tot3) end_time3 = time.time() ctime = end_time3-start_time3 timestr = str(datetime.timedelta(seconds=ctime)) timelist = str(datetime.timedelta(seconds=ctime)).split(".") print("sample_datetime 실행시간(초): ", ctime) print("sample_datetime 실행시간 timestr: ", timestr) print("sample_datetime 실행시간 timelist: ", timelist) print("sample_datetime 실행시간(시:분:초) -> ", timelist) def sample6(): start_time6 = timeit.default_timer() tot6 = 0 for i in range(100000000): tot6 = tot6 + i print("\nsample6 총합:", tot6) end_time6 = timeit.default_timer() print("sample6 실행시간(초): ", end_time6 - start_time6)
#main.py
import timechecksample timechecksample.sample1() timechecksample.sample2() timechecksample.sample_datetime()
[실행결과]
C:\Users\ilike\AppData\Local\Programs\Python\Python39\python.exe C:/python/Workspace/main.py sample1 총합: 49995000 sample1 실행시간(초): 0.0009987354278564453 sample2 총합: 4999999950000000 sample2 실행시간(초): 5.736712217330933 sample_datetime 총합: 4999999950000000 sample_datetime 실행시간(초): 6.2294299602508545 sample_datetime 실행시간 timestr: 0:00:06.229430 sample_datetime 실행시간 timelist: ['0:00:06', '229430'] sample_datetime 실행시간(시:분:초) -> ['0:00:06', '229430'] sample6 총합: 4999999950000000 sample6 실행시간(초): 6.0258684 Process finished with exit code 0
시:분:초로 표시하기위해 timedelta()메소드를 사용했습니다. datetime모듈의 timedelta 클래스 코드를 볼까요? seconds, day, microseconds, minutes, hours 등의 인자를 받아서 처리해줍니다.
class timedelta(SupportsAbs[timedelta]): min: ClassVar[timedelta] max: ClassVar[timedelta] resolution: ClassVar[timedelta] if sys.version_info >= (3, 6): def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ..., milliseconds: float = ..., minutes: float = ..., hours: float = ..., weeks: float = ..., *, fold: int = ...) -> None: ... else: def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ..., milliseconds: float = ..., minutes: float = ..., hours: float = ..., weeks: float = ...) -> None: ...
또 다른 방법이 하나 더 있습니다. time.perf_counter() 와 time.process_time()를 사용하는 방법입니다.
def sample4(): start_time4 = time.perf_counter() tot4 = 0 for i in range(100000000): tot4 = tot4 + i print("\nsample4 총합:", tot4) end_time4 = time.perf_counter() print("sample4 실행시간: ", end_time4 - start_time4) def sample5(): start_time5 = time.process_time() tot5 = 0 for i in range(100000000): tot5 = tot5 + i print("\nsample5 총합:", tot5) end_time5 = time.process_time() print("sample5 실행시간: ", end_time5 - start_time5)
sample4 총합: 4999999950000000 sample4 실행시간: 5.5738303 sample5 총합: 4999999950000000 sample5 실행시간: 5.453125
■perf_counter() : 벤치마킹을 위한 성능 카운터.
perf_counter()는 스톱워치를 사용하는 것처럼 프로세스가 걸리는 실제 시간을 측정합니다. (Itdoes include time elapsed during sleep )
■process_time() : 프로파일링을 위한 프로세스 시간 :커널 및 사용자 공간 CPU 시간의 합계.
process_time()은 CPU가 다른 것을 실행하는 시간을 포함하지 않습니다.
코드 효율성을 비교하려는 경우 process_time() 함수를 사용하는 것이 유용 할 수 있습니다.
(Itdoes not include time elapsed during sleep. )