About/Python

[Python] fucntools.lru_cache() - 함수의 결과 캐싱

김징어 2022. 2. 22. 19:57

파이썬의 표준 라이브러리에 있는 functools.lru_cache() 는 함수의 결과를 캐시해 주는 함수 데커레이터입니다. 같은 인수를 전달했던 호출 결과가 이미 캐시되어 있으면 함수를 실행하지 않고 캐시 결과를 반환합니다.

함수의 인수와 결과는 딕셔너리를 이용해서 연결하기 때문에 @lru_cache()를 붙인 함수의 인수는 숫자, 문자열, 튜플과 같이 딕셔너리의 key로 사용할 수 있는 객체를 사용해야 합니다.

예시

n번째 피보나치 수를 반환하는 함수 my_fibo() 함수는 재귀함수로 구현되어 있습니다. n이 커질수록 엄청나게 많은 함수가 중복되어 실행되기 때문에 실행 시간이 오래걸리게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
from time import time
 
def my_fibo(n):
    if n == 0 : return 0
    elif n == 1 or n == 2return 1
    else:
        return my_fibo(n-1+ my_fibo(n-2)
start_t = time()
print(my_fibo(40))
end_t = time()
print("exec time : ", end_t - start_t)
cs

 

위의 코드를 실행한 결과 약 25초가 걸렸습니다.

실행 결과

위의 my_fibo()를  functools.lru_cache() 를 사용하여 재귀함수의 결과를 캐싱한다면 어떻게 될까요?
재구성한 코드는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from time import time
from functools import lru_cache
 
@lru_cache(maxsize=32# 호출한 인수의 결과를 최대 32회까지 캐싱
def my_fibo(n):
    if n == 0 : return 0
    elif n == 1 or n == 2return 1
    else:
        return my_fibo(n-1+ my_fibo(n-2)
 
start_t = time()
print(my_fibo(40))
end_t = time()
print("exec time : ", end_t - start_t)
cs

 

위의 코드를 실행하면 실행시간이 엄청나게 줄어든 것을 확인할 수 있습니다. my_fibo() 함수가 재귀함수를 호출하면서 중복된 경우 함수를 호출하지 않고 캐싱된 결과를 반환하였기 때문입니다.

실행 결과


Pyhton 표준 라이브러리의  fucntools.lru_cache() 에 대하여 알아보았습니다.