Python3/Python3 language

[Python3] 파이썬 @cache @lru_cache 데코레이터

Razelo 2022. 3. 13. 16:31

최근 알고리즘 문제를 풀면서 이곳 저곳 블로그들을 돌아다니는 와중에 

 

굉장히 생소한 어노테이션을 사용하는 걸 볼 수 있었다. 

 

최적화에 관련해서 설명해주는 블로그였는데 메모이제이션을 쓰지 않고 @cache 어노테이션을 써서 해보겠다는 취지의 글이었다. 

 

내용은 이러하다. 

 

파이썬에는 @cache 데코레이터가 존재한다. 

functools 모듈에서 가져올 수 있으며 함수를 대상으로 사용한다. 

 

@cache 데코레이터를 어떤 함수의 선언부 위에 선언하면, 그 함수에 넘어온 인자를 키 key로 그리고 함수의 호출 결과를 값 value로 삼아서 메모이제이션이 자동으로 적용된다. 

 

대략 아래처럼 사용할 수 있다. 

from functolls import cache 

@cache
def dummyfunc(x):
    return x**x

 

를 하게 되면 함수에 전달한 x가 key 가 되고 

 

리턴 값인 x**x가 value가 되어 메모이제이션된다는 것이다. 

 

이뿐만 있는 것이 아니다. @lru_cache라는 데코레이터도 존재한다. 

 

운영체제를 공부하면서 LRU에 대해서 혹시 들어본 기억이 있을거다. 아렴풋하게 생각이 날텐데 즉 Least Frequently Used의 약어이다. 

 

마찬가지로 함수 위에 @lru_cache를 선언하면 된다. 

 

그리고 재밌는 것은 이 데코레이터는 size를 정할 수 있다. 

@lru_cache(maxsize = 2) 

이렇게 사용할 수 있다. 

 

<파이썬에 이렇게 유용한 기능이 있었는지 몰랐다. 다른 언어에서도 이와 비슷한 기능이 있는지는 들어본적이 없다. 있나? 그런데 어째 잘못쓰면 오히려 예상치 못한 오버헤드가 생길 수 있는 구간을 만들어낼 수도 있을 것 같다. lru_cache의 사이즈를 정하는 과정에서도 일정 확률로 hits 가 달라지기 때문에 항상 정확하게 메모이제이션에 남아있는 객체가 예상이 안된다. 실제로 쓰이긴 하려나? 그래도 흥미로운 기능이다. >

 

굉장히 잘 정리된 아래 블로그를 참고하는 것을 추천한다. 

https://www.daleseo.com/python-cache/

 

파이썬에서 캐시 적용하기 (feat. @cache, @lru_cache)

Engineering Blog by Dale Seo

www.daleseo.com

 

 

 

 

반응형