파이썬의 메모이제이션 데코레이터
7022 단어 pythonbeginnersprogramming
메모이제이션은 비용이 많이 드는 함수 호출의 결과를 저장하고 동일한 입력이 다시 발생할 때 캐시된 결과를 반환하여 프로그램 속도를 높이는 데 사용되는 최적화 기술입니다.
숫자의 계승
재귀적인 방법으로 숫자의 계승을 계산하는 함수를 만들어 봅시다.
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의 계승을 계산하기 위해 캐시된 결과를 사용했음을 알 수 있습니다.
다음 글에서는 다양한 종류의 데코레이터 레시피를 구현해 보겠습니다. 다가오는 기사를 계속 지켜봐주십시오. 뉴스레터를 구독하고 내 향후 기사를 받으려면 나와 연결하십시오.
Reference
이 문제에 관하여(파이썬의 메모이제이션 데코레이터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kcdchennai/memoization-decorator-in-python-3j3k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)