파이썬의 표준 라이브러리에 있는 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 == 2: return 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 == 2: return 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() 에 대하여 알아보았습니다.
'About > Python' 카테고리의 다른 글
[Python] Docstring에 대하여 (0) | 2022.03.10 |
---|---|
[Python] 파이썬 코드 스타일(PEP-8)을 따라야하는 이유 (0) | 2022.03.10 |
[Python] IPython을 사용한 Unix/Linux 셸 명령어 실행 - (IPython.utils.SList에 대하여) (1) | 2022.01.24 |
[Programmers] k진수에서 소수 개수 구하기(Python 풀이) - 2022 KAKAO BLIND RECRUITMENT (2) | 2022.01.24 |
[Python] 프로퍼티(Property)-getter, setter, deleter (0) | 2021.09.25 |