본문 바로가기

python

파이썬 함수 결과값 자동 캐싱(cache, lru_cache), python

파이썬 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):
    ...

 

이렇게 각 함수마다 독립적으로 캐싱을 할 수도 있다.