Tôi có một số chức năng chuyên sâu tính toán trong tập lệnh python của tôi mà tôi muốn lưu trữ. Tôi đã tìm kiếm các giải pháp trên stack stack và tìm thấy rất nhiều liên kết:
- /programming/4431703/python-resitable-instance-method-memoization-decorator
- https://wiki.python.org/moin/PythonDecoratorL Library#Memoize
- http://pythonhosted.org/cachetools/
- https://pythonhosted.org/Flask-Cache/ (Tôi đã sử dụng ứng dụng này cho các ứng dụng bình, nhưng ứng dụng này không phải là ứng dụng bình).
Cuối cùng, tôi đã kết thúc việc dán nó vào chương trình của tôi. Có vẻ như đủ đơn giản - và hoạt động tốt.
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)
Tuy nhiên, tôi tự hỏi liệu có một thực hành tốt nhất trong Python. Tôi đoán tôi đã giả định rằng sẽ có một gói được sử dụng rất phổ biến để xử lý việc này và bối rối về lý do tại sao điều này không tồn tại. http://pythonhosted.org/cachetools/ chỉ có trên phiên bản .6 và cú pháp phức tạp hơn việc thêm một trình trang trí @memoize, như trong các giải pháp khác.
@cached_property
trang trí , phù hợp hơn cho các phương thức có giá trị trả về được dự kiến sẽ giữ nguyên trong suốt vòng đời của thể hiện.