是否有一個裝飾器來簡單地緩存函數返回值?考慮以下:@propertydef name(self):
if not hasattr(self, '_name'):
# expensive calculation
self._name = 1 + 1
return self._name我是新手,但我認為緩存可能會被裝入裝飾器中。只有我找不到喜歡它的人;)PS真正的計算不依賴于可變值
3 回答

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
從Python 3.2開始,有一個內置的裝飾器:
@functools.lru_cache(maxsize=100, typed=False)
Decorator用一個memoizing callable來包裝一個函數,它可以節省maxsize最近的調用。當使用相同的參數定期調用昂貴的或I / O綁定函數時,它可以節省時間。
用于計算Fibonacci數的LRU高速緩存示例:
@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,這里有一個其他兼容的memoization庫列表:

交互式愛情
TA貢獻1712條經驗 獲得超3個贊
class memorize(dict): def __init__(self, func): self.func = func def __call__(self, *args): return self[args] def __missing__(self, key): result = self[key] = self.func(*key) return result
樣品用途:
>>> @memorize... def foo(a, b):... return a * b>>> foo(2, 4)8>>> foo{(2, 4): 8}>>> foo('hi', 3)'hihihi'>>> foo{(2, 4): 8, ('hi', 3): 'hihihi'}
添加回答
舉報
0/150
提交
取消