次の点を考慮してください。
@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 にこだわっている場合は、互換性のある他のメモ化ライブラリのリストを以下に示します。