코드 실행 시간을 확인할 때는 보통 time 모듈을 사용해서 시작 시점과 종료 시점의 차이를 계산합니다.
하지만 이런 코드를 매번 반복해서 쓰는 건 번거롭습니다.
이때 컨텍스트 매니저(Context Manager) 를 활용하면 실행 시간 측정을 깔끔하게 관리할 수 있습니다.
1. 실행 시간 측정 클래스 만들기
import time
class ExcuteTimer(object):
def __init__(self, msg):
# 메시지를 받아서 저장
self._msg = msg
def __enter__(self):
# with 블록 진입 시점
self._start = time.monotonic() # 단조 증가 시간(시계 기준이 아님)
return self._start
def __exit__(self, exc_type, exc_value, exc_traceback):
# with 블록을 빠져나올 때 호출됨
if exc_type:
# 블록 내부에서 예외가 발생한 경우
print("Logging exception {}".format((exc_type, exc_value, exc_traceback)))
else:
# 정상 종료 시 실행 시간 출력
print(f'{self._msg} : {time.monotonic() - self._start}s')
# True → 예외가 발생했더라도 여기서 처리 후 with 블록 바깥으로 전파하지 않음
return True
사용 예시
with ExcuteTimer('Start! job') as v:
print('Received start monotonic : {}'.format(v))
# 실행할 작업
for i in range(1000000):
pass
실행 결과:
Received start monotonic : 123456.789
Start! job : 0.045s
- __enter__ → 블록 시작 시간 기록
- __exit__ → 블록 종료 후 실행 시간 출력
- 내부에서 예외가 발생하면 exc_type, exc_value, exc_traceback 로 예외 정보를 받을 수 있습니다.
2. 예외 처리까지 포함
컨텍스트 매니저의 장점은, 작업 도중 에러가 발생해도 종료 시점에 항상 __exit__가 실행된다는 점입니다.
with ExcuteTimer('Error job'):
raise ValueError("테스트 에러")
출력:
Logging exception (<class 'ValueError'>, ValueError('테스트 에러'), <traceback object at 0x...>)
정리하면
- 컨텍스트 매니저를 이용하면 실행 시간 측정을 한 줄로 깔끔하게 처리할 수 있다.
- time.monotonic() 을 사용하면 시스템 시간 변경과 무관하게 안정적인 측정이 가능하다.
- __exit__ 는 예외 처리까지 담당하므로, 실행 환경에 안전성을 보장한다.
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 메모리를 아끼는 파이썬 데이터 처리 비법 — map, filter, reduce (0) | 2025.09.13 |
|---|---|
| 파이썬에서 내부 자원과 외부 리소스의 차이 (0) | 2025.09.13 |
| 파이썬 컨텍스트 매니저(Context Manager) 완전 정리 (0) | 2025.09.13 |
| Python 객체 복사: Copy, Shallow Copy, Deep Copy (0) | 2025.09.13 |
| Python 함수 재사용: lambda보다 내부 함수 구조가 좋은 경우 (0) | 2025.09.13 |