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)
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
참고) 다양한 Decorator 사용법: https://velog.io/@pm1100tm/Python-decorator-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0
관련 글:
[SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법
[SW 개발/Python] - Python 정규식(Regular Expression) re 모듈 사용법 및 예제
[SW 개발/Python] - Python 2.x에서 3.x으로 코드 자동 변환
[SW 개발/Python] - Python으로 압축 파일 다루기: Zipfile 과 shutil.make_archive()
[SW 개발/Python] - Python에서 URL 한글 깨짐 현상: quote_plus()와 unquote_plus()
댓글