호랭이 분석가

코드 실행 시간 측정하기 Decorator (Context Manager) 본문

Python

코드 실행 시간 측정하기 Decorator (Context Manager)

데이터호랑이 2023. 7. 23. 16:36
반응형

 

미드저니로 생성한 이미지

 

 

1. Decorator (데코레이터)

 

Decorator는 다른 함수를 장식하거나 수정하는 함수입니다.

Decorator는 함수를 인자로 받아서 새로운 함수를 반환합니다.

이를 사용하면 코드를 재사용하고, 로직을 캡슐화하고

기존 함수를 수정하지 않고도 행동을 추가하거나 변경할 수 있습니다.

 

Decorator를 통해서 함수의 실행 시간을 측정해 보도록 하겠습니다.

 

def timer(func) :

    def wrapper(*args, **kwargs) :

        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()

        elapsed_time = end_time - start_time
        td = timedelta(seconds=elapsed_time)
        
        print(f"{func.__name__} 함수의 실행 시간 : {str(td)}초")

        return result

    return wrapper

 

위 코드는 함수를 인자로 받아서

주어진 함수의 실행 시간을 측정하고 그 시간을 출력하는 함수입니다.

 

result = func(*args, **kwargs)를 통해

원래 함수가 받는 모든 인자를 포착하여 사용하기 때문에

모든 함수에 적용하여 사용 가능합니다.

 

예제 코드로 실행 시간을 측정해보도록 하겠습니다.

 

@timer
def sum(x, y):
    return x + y

sum(10, 100)

 

 

 sum 함수 작성시 @를 통해 decorator를 적용할 수 있습니다.

이를 통해 10과 100을 더하는 sum 함수를 실행 시 위와 같이 시간을 측정할 수 있습니다.

 

 

2. Context Manager

 

Context Manager는 with를 사용하는 코드 블럭에서 사용 가능한 객체입니다.

with 코드는 해당 블럭에 들어가기 전과 나오기 후에 어떠한 작업을 실행하게 합니다.

파일을 열거나, 데이터베이스 트랜잭션을 시작하거나,

임시적으로 로깅 레벨을 변경하는 등의 작업을 하게 됩니다.

 

Context Manager를 이용하여 코드의 실행 시간을 측정하는 코드를 동일하게 작성해 보겠습니다.

 

import time
from contextlib import contextmanager
from datetime import datetime, timedelta

@contextmanager
def timer(name):
    start_time = time.time()
    yield
    end_time = time.time()

    elapsed_time = end_time - start_time
    td = timedelta(seconds=elapsed_time)

    print(f"{name} 실행 시간 : {str(td)}초")

 

contextlib을 이용하여 함수를 작성합니다.

일반 Decorator를 작성할 때와는 다르게

yield가 사용되는데, 이를 이용하여

with 불록 내에서 실행할 수 있는 코드를 입력할 수 있도록 합니다.

yield 아래에 오는 코드가 실행되기 전에 실행됩니다.

 

with timer('계산') :
    x = 1
    y = 2
    print(x+y)

 

 

위의 Decorator 예제와는 다른 결과를 얻었는데요,

yield에서 print(x+y)까지 코드가 실행되기 때문에

실행 시간이 출력되기 전 x+y의 값이 먼저 출력됩니다.

 

이를 통해 함수가 아닌 단일 코드에 대한 실행 시간도 측정할 수 있습니다.

Comments