LoginSignup
0
0

More than 3 years have passed since last update.

関数結果をキャッシュして使う(functools.lru_cached)(Python)

Posted at

概要

関数結果をキャッシュしたい時に、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で返す。

参考にさせていただいた本・頁

感想

便利!使えそう。

今後

使っていきたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0