#概要
関数結果をキャッシュしたい時に、functools.lru_cachedを使えば良い。
自前で作らなくても大丈夫かもしれない。
#内容
##環境
macOS Catalina
Python 3.7.0
##全体像
fibo.py
import functools
@functools.lru_cache(maxsize=None)
def factorial(n):
print('in', n)
return n * factorial(n-1) if n else 1
print('fac 5', factorial(5))
print('fac 3', factorial(3))
print('fac 12', factorial(12))
output
in 5
in 4
in 3
in 2
in 1
in 0
fac 5 120
fac 3 6
in 12
in 11
in 10
in 9
in 8
in 7
in 6
fac 12 479001600
同じ引数は2度評価されていないことが分かる。
##解説
lru: least recently used
最近使ったものだけをmaxsize
までキャッシュする。
maxsize=None
とすると、全てキャッシュされる。
##蛇足
wrapにより、以下のメソッド・属性が追加される。
-
factorial.cache_info()
:maxsizeやcache済数などを示す -
factorial.__wrapped__
:wrap前の関数。cache回避や別のwrapに有用。 -
factorial.cache_clear()
:cacheを削除する -
factorial.cache_parameters()
:3.9以降で使用可能。dictで返す。
#参考にさせていただいた本・頁
- https://docs.python.org/3/library/functools.html#functools.lru_cache
- https://docs.python.org/ja/3/library/functools.html
#感想
便利!使えそう。
#今後
使っていきたい。