8
6

More than 1 year has passed since last update.

functoolsのlru_cache, cacheデコレータはメソッドには使用してはいけない

Posted at

Pythonの標準ライブラリfunctoolsにある、cachelru_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
8
6
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
8
6