関数の戻り値を単純にキャッシュするデコレータはありますか? 質問する

関数の戻り値を単純にキャッシュするデコレータはありますか? 質問する

次の点を考慮してください。

@property
def name(self):

    if not hasattr(self, '_name'):

        # expensive calculation
        self._name = 1 + 1

    return self._name

私は初心者ですが、キャッシュはデコレータに分解できると思います。ただ、そのようなものは見つかりませんでした ;)

PS実際の計算は可変値に依存しません

ベストアンサー1

Python 3.2 以降では、組み込みのデコレータがあります。

@functools.lru_cache(maxsize=100, typed=False)

関数を、最新の呼び出しを最大 maxsize まで保存するメモ化呼び出し可能関数でラップするデコレータ。高価な関数や I/O バウンド関数が同じ引数で定期的に呼び出される場合に、時間を節約できます。

フィボナッチ数列を計算するための LRU キャッシュの例:

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

>>> print([fib(n) for n in range(16)])
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

>>> print(fib.cache_info())
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)

Python 2.x にこだわっている場合は、互換性のある他のメモ化ライブラリのリストを以下に示します。

おすすめ記事