파이썬/기초 프로그래밍

파이썬 컨텍스트 매니저로 실행 시간 측정하기

Data Jun 2025. 9. 13. 16:33

코드 실행 시간을 확인할 때는 보통 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__ 는 예외 처리까지 담당하므로, 실행 환경에 안전성을 보장한다.