파이썬 functools에는 cache와 lru_cache이 있다.
둘 다 함수의 결과값을 자동으로 캐싱해 주는 기능이다.
lru_cache(Least Recently Used)는 최근에 가장 적게 사용된 캐시를 삭제한다.
또한 maxsize로 캐시 용량을 제한할 수 있다.
maxsize를 미리 예측해야 된다는 단점이 있다.
cache는 삭제가 없고 무제한으로 캐싱을 한다.
따라서 메모리 사용량이 많아질 수 있다.
LRU관리를 하지 않기 때문에 속도 측면에서 lru_cache보다 약간 빠르다고 한다.
이 기능을 쓰면 dp배열을 만들지 않고도 재귀 함수만으로 dp와 같은 기능을 구현할 수 있다.
사용방법은 간단하다. cache를 import 하고, @cache를 캐싱할 함수 위에 선언해 주면 된다.
n을 입력받아 n번째 피보나치 수를 출력하는 함수가 있다.
n=int(input())
def fib(n):
if n==1 or n==2:
return 1
return fib(n-1)+fib(n-2)
print(fib(n))
여기서 n이 커지게 되면 재귀함수에서 중복된 함수를 계속 호출하게 되어 시간초과가 나게 된다.
n=int(input())
dp = [0] * (n+1)
dp[1] = dp[2] = 1
for i in range(3,n+1):
dp[i] = dp[i-1] + dp[i-2]
print(dp[n])
dp배열을 만들면 중복된 호출을 없애서 해결할 수 있다.
from functools import cache
n=int(input())
@cache
def fib(n):
if n==1 or n==2:
return 1
return fib(n-1)+fib(n-2)
print(fib(n))
cache기능을 사용하면 중복된 함수 결과값을 캐시에서 가져오게 되어 dp배열을 만든 것과 동일한 효과를 얻을 수 있다.
from functools import lru_cache
n=int(input())
@lru_cache(maxsize=10**6)
def fib(n):
if n==1 or n==2:
return 1
return fib(n-1)+fib(n-2)
print(fib(n))
lru_cache도 동일하게 import 한 다음 선언해 주면 된다. maxsize를 정할 수 있다.
여기서 maxsize는 최근 사용된 함수의 결과값을 몇 개까지 캐시로 저장할 것인지를 의미한다.
from functools import cache
@cache
def function1(n):
...
@cache
def function2(n):
...
@cache
def function3(n):
...
이렇게 각 함수마다 독립적으로 캐싱을 할 수도 있다.
'python' 카테고리의 다른 글
| [백준] 20149 선분 교차 3, python (0) | 2025.10.21 |
|---|---|
| [백준] 1707 이분 그래프, python (0) | 2025.10.19 |
| [백준] 2696 중앙값 구하기, python (0) | 2025.10.14 |
| [백준] 25682 체스판 다시 칠하기 2, python (0) | 2025.10.14 |
| [백준] 13459 구슬 탈출, python (0) | 2025.10.10 |