최근 알고리즘 문제를 풀면서 이곳 저곳 블로그들을 돌아다니는 와중에
굉장히 생소한 어노테이션을 사용하는 걸 볼 수 있었다.
최적화에 관련해서 설명해주는 블로그였는데 메모이제이션을 쓰지 않고 @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/
'Python3 > Python3 lang' 카테고리의 다른 글
[Pythone] Python3 Memory Error 발생 - 파이썬 메모리 에러 발생 (0) | 2022.04.02 |
---|---|
[Python3] 코딩테스트 파이썬 사용시 유일한 단점 - 파이썬의 객체 복사 방식(깊은 복사와 얕은 복사) (0) | 2022.03.19 |
[Python3] Python 에서 assert 란? (0) | 2021.12.01 |
[Python3] Python 에서 nonlocal과 정적 스코프 (0) | 2021.10.09 |
[Python3] Python에서의 False와 None은 같은 것인가? (0) | 2021.08.14 |