猿问

是否有一个装饰器来简单地缓存函数返回值?

是否有一个装饰器来简单地缓存函数返回值?

考虑以下:

@propertydef name(self):

    if not hasattr(self, '_name'):

        # expensive calculation
        self._name = 1 + 1

    return self._name

我是新手,但我认为缓存可能会被装入装饰器中。只有我找不到喜欢它的人;)

PS真正的计算不依赖于可变值


沧海一幻觉
浏览 454回答 3
3回答

Smart猫小萌

从Python 3.2开始,有一个内置的装饰器:@functools.lru_cache(maxsize=100, typed=False)Decorator用一个memoizing callable来包装一个函数,它可以节省maxsize最近的调用。当使用相同的参数定期调用昂贵的或I / O绑定函数时,它可以节省时间。用于计算Fibonacci数的LRU高速缓存示例:@lru_cache(maxsize=None)def&nbsp;fib(n): &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;n&nbsp;<&nbsp;2: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;fib(n-1)&nbsp;+&nbsp;fib(n-2)>>>&nbsp;print([fib(n)&nbsp;for&nbsp;n&nbsp;in&nbsp;range(16)])[0,&nbsp;1,&nbsp;1,&nbsp;2,&nbsp;3,&nbsp;5,&nbsp;8,&nbsp;13,&nbsp;21,&nbsp;34,&nbsp;55,&nbsp;89,&nbsp;144,&nbsp;233,&nbsp;377,&nbsp;610]>>>&nbsp;print(fib.cache_info())CacheInfo(hits=28,&nbsp;misses=16,&nbsp;maxsize=None,&nbsp;currsize=16)如果你坚持使用Python 2.x,这里有一个其他兼容的memoization库列表:functools32|&nbsp;PyPI&nbsp;|&nbsp;源代码repoze.lru|&nbsp;PyPI&nbsp;|&nbsp;源代码pylru|&nbsp;PyPI&nbsp;|&nbsp;源代码backports.functools_lru_cache|&nbsp;PyPI&nbsp;|&nbsp;源代码

交互式爱情

class&nbsp;memorize(dict): &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;func): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.func&nbsp;=&nbsp;func&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__call__(self,&nbsp;*args): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self[args] &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__missing__(self,&nbsp;key): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;self[key]&nbsp;=&nbsp;self.func(*key) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result样品用途:>>>&nbsp;@memorize...&nbsp;def&nbsp;foo(a,&nbsp;b):...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a&nbsp;*&nbsp;b>>>&nbsp;foo(2,&nbsp;4)8>>>&nbsp;foo{(2,&nbsp;4):&nbsp;8}>>>&nbsp;foo('hi',&nbsp;3)'hihihi'>>>&nbsp;foo{(2,&nbsp;4):&nbsp;8,&nbsp;('hi',&nbsp;3):&nbsp;'hihihi'}
随时随地看视频慕课网APP

相关分类

Python
我要回答