Pythonの標準ライブラリfunctoolsにある、cache
とlru_cache
デコレータですが、メソッドにも使えそうですが、使ってはいけないということが下記のビデオで詳しく解説されています。
使ってはいけない理由は、キャッシュ付きメソッドがコールされたインスタンスは、一生ガーベージコレクションされないで残ってしまうからということです。メソッドの第一引数にself
が渡されるので、キャッシュがself
をキーとして保存してしまうためです。
この問題は回避可能で、その方法も上記のビデオで紹介されています。
例えば、下記のdouble
をキャッシュしたいとします。
from functools import cache
class Foo:
def __init__():
pass
def double(self, x):
print("Double ", str(x))
return 2 * x
次のように、インスタンス変数にデコレータに通した元のメソッドを代入するとよいようです。
from functools import cache
class Foo:
def __init__(self):
self.double = cache(self._double)
def _double(self, x):
print("Double ", str(x))
return 2 * x