亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否有一個裝飾器來簡單地緩存函數返回值?

是否有一個裝飾器來簡單地緩存函數返回值?

滄海一幻覺 2019-08-26 17:53:41
是否有一個裝飾器來簡單地緩存函數返回值?考慮以下:@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庫列表:


查看完整回答
反對 回復 2019-08-26
?
交互式愛情

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'}


查看完整回答
反對 回復 2019-08-26
  • 3 回答
  • 0 關注
  • 483 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號