본문 바로가기
SW 개발/Python

Python Decorator를 이용한 함수 실행 시간 측정 방법 (Sample code)

by Kibua20 2021. 12. 3.

Python 함수의 실행 결과를 측정이 필요한 경우가 있습니다.  일반적으로 linux에서 time 명령어를 사용할 수 있고, Python code 자체에서는  @함수명으로 표시되는 decorator를 사용할 수 있습니다. 

 

Python 함수 실행 시간 측정

import time

def elapsed(f):
    def wrap(*args):
        start_r = time.perf_counter()
        start_p = time.process_time()
        # 함수 실행
        ret = f(*args)
        end_r = time.perf_counter()
        end_p = time.process_time()
        elapsed_r = end_r - start_r
        elapsed_p = end_p - start_p

        print(f'{f.__name__} elapsed: {elapsed_r:.6f}sec (real) / {elapsed_p:.6f}sec (cpu)')
        return ret
   # 함수 객체를 return
    return wrap

@elapsed
def test_function():
    time.sleep(10)

# 함수 실행
test_function()

#측정 결과
test_function elapsed: 10.000476sec (real) / 0.000048sec (cpu)

※ 참고 링크: https://tyanjournal.com/tips/python-%ED%95%A8%EC%88%98-%EC%8B%A4%ED%96%89-%EC%8B%9C%EA%B0%84-%EC%B8%A1%EC%A0%95%ED%95%98%EA%B8%B0/

 

Decorator는 실행하려는 함수 위에 @로 선언하고, 함수를 parameter로 받아 필요한 명령어를 추가 후 다시 함수 형태로 반환하는 함수입니다. 함수를 수정하지 않고, 실행 전/후에 필요한 전처리나 후처리를 추가할 때 사용합니다.  본 예제와 같이 함수 실행 시간이나, Flask에서 api 정의 시에 사용됩니다.  추가적인 내용은  링크 1, 링크 2를 참조해주세요.   

 

시간 측정은 time.perf_counter()와 time.process_time()을 사용할 수 있습니다. perf_counter()는 sleep을 포함하여 system전체적으로 측정하는 값으로  실제 시간에 해당합니다.  time.process_time()은 해당 process의 system+user time입니다.  앞에 예제에서 보면 test_function에서는 sleep(10)이기 때문에 per_counter() 차이는 대략 10초이고, process_time()은 0.000048입니다. 즉, 실제 시간은 10 sec가 지났지만,  실제 CPU 구동 시간은 매우 작습니다.  

 

  • time.perf_counter:  Real time
  • time.process_time(): CPU time

 

출처: https://docs.python.org/3/library/time.html

 

 참고) 다양한 Decorator 사용법:  https://velog.io/@pm1100tm/Python-decorator-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0

 

관련 글:

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Random Number를 가지는 Pandas Dataframe 생성 (잘된 code와 잘못된 code 비교)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Pandas Dataframe 처리 속도 향상을 위한 병렬 처리 방법: Swifter 모듈 (사용법 쉬움)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Pandas Dataframe Groupby() 함수로 그룹별 연산하기: Split, Apply, Combine

[SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법

[SW 개발/Python] - Python 정규식(Regular Expression) re 모듈 사용법 및 예제

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Selenium과 BeautifulSoup을 활용하여 Google PlayStore 사용자 리뷰 (댓글) 가져오기 (Sample Code 포함)

[SW 개발/Python] - Python 2.x에서 3.x으로 코드 자동 변환

[SW 개발/Python] - Python으로 압축 파일 다루기: Zipfile 과 shutil.make_archive()

[SW 개발/Python] - Python에서 URL 한글 깨짐 현상: quote_plus()와 unquote_plus()




댓글