lru_cacheは、fuctoolsライブラリーに定義されているデコレーターです。
LRUは、Least Recently Usedの略で、最も直近で使われていないデータを最初に捨てるキャッシュアルゴリズムです。
ここでは、同じ引数であれば、結果をキャッシュして1回しか計算しない方法について説明します。
使い方は簡単で、関数にデコレーターの@lru_cache(maxsize=1024)
を追加するだけです。
そうすると、引数をキーにした辞書(キャッシュ)に関数の実行結果があれば、実行せずにその結果を返します。maxsize
は、キャッシュのサイズを指定します。デフォルトは128で小さいので、1024と大きい数字にしています。メモリ使用量を考慮しながら決めましょう。
from functools import lru_cache
# キャッシュなしで実行
class Fibonacci:
count = 0
def fib(self, n):
Fibonacci.count += 1
return n if n < 2 else self.fib(n - 1) + self.fib(n - 2)
Fibonacci().fib(30)
count1 = Fibonacci.count
count1
2692537
# キャッシュありで実行
class Fibonacci:
count = 0
@lru_cache(maxsize=1024)
def fib(self, n):
Fibonacci.count += 1
return n if n < 2 else self.fib(n - 1) + self.fib(n - 2)
Fibonacci().fib(30)
count2 = Fibonacci.count
count2
31
コメント