[Python] Python 코드 실행시간 측정 4가지 방법 (feat. Jupyter Notebook)

반응형

 

Python Logo

Contents

    1. 배경

    파이썬으로 코드를 짜다보면, 코드가 엄청 오래 걸린다고 느낄 때가 있습니다. 그럴 때 함수 별로, 혹은 코드별로 걸리는 시간을 측정해 병목현상을 해결할 수 있습니다. python 라이브러리를 이용해 코드의 시간을 측정하는 방법주피터 노트북을 이용하는 경우 매직 커맨드를 이용해 코드의 시간을 측정하는 방법을 알아보겠습니다.

     

    2. 코드 실행시간 측정

    1) time 라이브러리 이용 (초 단위)

    import time # time 라이브러리 import
    start = time.time() # 시작
    
    time.sleep(1) # 측정하고자 하는 코드 부분
    
    print(f"{time.time()-start:.4f} sec") # 종료와 함께 수행시간 출력

    python에서 기본적으로 시간을 다룰 수 있는 time 라이브러리를 import 합니다. 여기서 수행 시간을 측정하고자 하는 부분은 time.sleep(1) 부분으로 1초간 대기하는 코드입니다. 그 위로, start = time.time() 을 통해, 시작 시간을 할당합니다. 마지막엔 time.time() - start를 통해 종료시간 - 시작시간을 계산합니다. f-string을 이용해서 소수점 4자리까지만 초 단위(sec)로 출력하였습니다. 아래 출력된 결과를 보면 1.0007초가 출력되었습니다.

    * 출력

    time 라이브러리 이용 코드 수행시간 측정

     

    ★ time.time()의 의미

    지금 time.time()을 실행해보면 아래처럼 1657113431.540124 가 출력됩니다. 이는 16억 5711만 3431.540124 초로, UTC 시간 기준으로 1970년도 1월 1일 00:00:00시를 기준으로 현재까지를 1초 단위로 센 시간을 의미합니다. 왜 1970년도가 기준이 된지는 모르겠습니다. 아마 이 정도면 프로그래밍 언어로 시간 측정 시 큰 무리 없는 기준이겠다고 생각했을 것 같습니다.

    * 출력

    time.time() 의미

     

    2) datetime 라이브러리 이용 (시:분:초 단위)

    import time
    import datetime # datetime 라이브러리 import
    
    start = time.time() # 시작
    time.sleep(1) # 수행시간 측정하고자 하는 코드 부분
    sec = time.time()-start # 종료 - 시작 (걸린 시간)
    
    times = str(datetime.timedelta(seconds=sec)) # 걸린시간 보기좋게 바꾸기
    short = times.split(".")[0] # 초 단위 까지만
    print(f"{times} sec")
    print(f"{short} sec")

    이번엔 datetime 라이브러리를 추가해서, 걸린 시간을 "시:분:초" 로 보기 좋게 출력해보겠습니다. 마찬가지로, time.sleep(1) 부분이 수행 시간을 측정하고자 하는 코드 부분입니다. 그 위로, start = time.time() 으로 시작된 절대 시간을 기록하고, 아래에 sec = time.time() - start종료시간 - 시작시간을 sec에 저장합니다. datetime.timedelta(seconds=sec)은 sec(초)를 "시:분:초.마이크로초" 형식의 문자열로 바꿔주는 기능입니다. 여기서 times.split(".")[0]을 적용하면 마이크로초 부분은 떼 버리고, 초 단위까지만 보겠다는 것입니다. 즉, times는 마이크로초까지 출력하고, short는 초까지만 출력합니다.

    * 출력

    datetime.timedelta 이용 보기좋게 수행 시간 출력

     

     

    3) %%timeit

    %%timeit
    time.sleep(1)

    %%timeit주피터 노트북에서 지원하는 매직 커맨드입니다. 셀 맨 위에 %%timeit를 작성하면 해당 셀에 있는 코드를 반복 실행해서 더 정확하게 실행 시간을 측정해 줍니다.

    아래 예시를 보면 7번 수행을 1번 반복해서 1초 ± 1.5ms로 표준편차까지 계산해줍니다. 복잡한 함수를 쓰면 알아서 더 많이 수행해서 더 정확한 수행 시간을 출력해 줍니다.

    * 출력

    %%timeit 매직 커맨드

     

    4) %%time

    %%time
    time.sleep(1)

    %%time 역시 주피터 노트북에서 지원하는 매직 커맨드입니다. %%timeit과 달리 한 번만 수행하지만 CPU 수행 시간과 실제 시간을 같이 출력합니다. 아래 예시를 보면, CPU times와 Wall time으로 크게 구분됩니다. CPU times는 컴퓨터 내부의 CPU가 코드를 수행한 시간이고, Wall time은 컴퓨터 밖에서 걸린 시간(실제 수행 시간)으로 코드가 수행되는 데 걸린 시간을 잰 것입니다. CPU times에 user와 sys 그리고 total이 있는데, user는 주피터 노트북 커널 내부의 CPU가 코드를 수행하는 데 걸린 시간이고, sys는 커널 외부의 CPU가 코드를 수행하는 데 걸린 시간입니다. 쉽게말해, 코드를 수행하는데 Python 내부 시스템이 수행한 시간(user)과 Python 외부 시스템이 수행한 시간(sys)이라고 생각하시면 되겠습니다.

    * 출력

    %%time 매직 커맨드

     

    이렇게 프로그램이 수행하는데 걸리는 시간을 다양하게 확인하는 방법을 알아보았습니다. 

    읽어주셔서 감사합니다.

    다음에 더 재미있고 유익한 글로 찾아뵙겠습니다.

     

    * 위의 실습 코드는 아래 링크에 모두 정리되어 있습니다.

     

    GitHub - netsus/python_practice: basic python course

    basic python course. Contribute to netsus/python_practice development by creating an account on GitHub.

    github.com

     

    Reference
    1. Python Logo : https://www.redbubble.com/i/pin/Python-logo-by-Shirtupme/46071453.NP9QY
    2. Python 수행 시간: https://blockdmask.tistory.com/549
    3. 주피터 노트북 수행 시간: https://haloaround.tistory.com/241
    반응형

    댓글

    Designed by JB FACTORY