파이썬의 메모이제이션 데코레이터

Python decorator series 에 대한 이전 문서에서 데코레이터의 작동 방식과 간단한 함수 기반 데코레이터 및 클래스 기반 데코레이터와 매개변수를 지원하는 데코레이터를 구현하는 방법을 배웠습니다. 이 기사에서는 결과를 캐시하는 간단한 메모이제이션 데코레이터 함수를 만듭니다.

메모이제이션은 비용이 많이 드는 함수 호출의 결과를 저장하고 동일한 입력이 다시 발생할 때 캐시된 결과를 반환하여 프로그램 속도를 높이는 데 사용되는 최적화 기술입니다.

숫자의 계승



재귀적인 방법으로 숫자의 계승을 계산하는 함수를 만들어 봅시다.


def factorial(n):
    if n == 1:
        return n
    else:
        return n * factorial(n - 1)


if __name__ == '__main__':
    print(factorial(20))
    print(factorial(10))
    print(factorial(15))
    print(factorial(5))



산출

2432902008176640000
3628800
1307674368000
120


주어진 숫자의 계승은 항상 동일(멱등성)하므로 주어진 값에 대한 결과를 캐싱하여 이 기능을 최적화할 수 있습니다. 데코레이터 함수를 만들어 봅시다.

from functools import wraps


def memoize(func):
    cache = {}

    @wraps(func)
    def wrapper(*args, **kwargs):
        if args not in cache:
            print(f"Calling for {func.__name__}({args})")
            cache[args] = func(*args, **kwargs)
        else:
            print(f"Using cached result for {func.__name__}({args})")
        return cache[args]

    return wrapper


@memoize
def factorial(n):
    if n == 1:
        return n
    else:
        return n * factorial(n - 1)


if __name__ == '__main__':
    print(factorial(20))
    print(factorial(10))
    print(factorial(15))
    print(factorial(5))



산출

Calling for factorial((20,))
Calling for factorial((19,))
Calling for factorial((18,))
Calling for factorial((17,))
Calling for factorial((16,))
Calling for factorial((15,))
Calling for factorial((14,))
Calling for factorial((13,))
Calling for factorial((12,))
Calling for factorial((11,))
Calling for factorial((10,))
Calling for factorial((9,))
Calling for factorial((8,))
Calling for factorial((7,))
Calling for factorial((6,))
Calling for factorial((5,))
Calling for factorial((4,))
Calling for factorial((3,))
Calling for factorial((2,))
Calling for factorial((1,))
2432902008176640000
Using cached result for factorial((10,))
3628800
Using cached result for factorial((15,))
1307674368000
Using cached result for factorial((5,))
120


출력에서 10, 15 및 5의 계승을 계산하기 위해 캐시된 결과를 사용했음을 알 수 있습니다.

다음 글에서는 다양한 종류의 데코레이터 레시피를 구현해 보겠습니다. 다가오는 기사를 계속 지켜봐주십시오. 뉴스레터를 구독하고 내 향후 기사를 받으려면 나와 연결하십시오.

좋은 웹페이지 즐겨찾기