キャッシュしたいpythonスクリプトに計算集中型の関数がいくつかあります。私はスタックオーバーフローの解決策を探しに行き、たくさんのリンクを見つけました:
- /programming/4431703/python-resettable-instance-method-memoization-decorator
- https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
- http://pythonhosted.org/cachetools/
- https://pythonhosted.org/Flask-Cache/(私はこれをフラスコアプリケーションに使用しましたが、これはフラスコアプリケーションではありません)。
結局、これを自分のプログラムに貼り付けてしまいました。それは十分に単純に見えます-そしてうまく働きます。
class memoized(object):
'''Decorator. Caches a function's return value each time it is called.
If called later with the same arguments, the cached value is returned
(not reevaluated).
'''
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self, *args):
if not isinstance(args, collections.Hashable):
return self.func(*args)
if args in self.cache:
return self.cache[args]
else:
value = self.func(*args)
self.cache[args] = value
return value
def __repr__(self):
'''Return the function's docstring.'''
return self.func.__doc__
def __get__(self, obj, objtype):
'''Support instance methods.'''
return functools.partial(self.__call__, obj)
ただし、Pythonには正規のベストプラクティスがあるかどうかと思います。私はこれを処理するために非常に一般的に使用されるパッケージがあると想定し、これが存在しない理由について混乱しています。http://pythonhosted.org/cachetools/はバージョン.6のみであり、構文は他のソリューションのように単に@memoizeデコレータを追加するよりも複雑です。
@cached_property
デコレータが追加されました。