如何使用Python内置缓存装饰器: @lru_cache,@cache 与 @cached_property
warning:
这篇文章距离上次修改已过198天,其中的内容可能已经有所变动。
在Python中,functools
模块提供了几个用于函数装饰的工具,其中包括缓存装饰器。
@lru_cache
: 使用最近最少使用(LRU)算法实现的缓存。它会缓存函数的返回值,并且会在再次调用相同参数的时候直接返回缓存的结果。
from functools import lru_cache
@lru_cache(maxsize=128) # 可以指定缓存的大小
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(38)) # 使用缓存后,计算较大的数值会更快
@cache
: 是@lru_cache(maxsize=None)
的快捷方式,没有指定缓存的大小,所以缓存将会保存所有的调用记录。
from functools import cache # 等同于lru_cache(maxsize=None)
@cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(38)) # 使用没有大小限制的缓存后,计算较大的数值可能会变慢
@cached_property
: 装饰器用于只在属性第一次被访问时进行的计算。之后的访问将直接返回同样的结果,而不再重新执行函数。
from functools import cached_property
class MyClass:
def __init__(self):
self._value = 0
@cached_property
def compute(self):
self._value += 1
return self._value
obj = MyClass()
print(obj.compute) # 第一次调用会执行函数,并缓存结果
print(obj.compute) # 再次调用将直接返回缓存的结果
以上代码展示了如何使用这些缓存装饰器。需要注意的是,@cached_property
通常用于类属性的缓存,而其他两个主要用于函数的缓存。在使用缓存时,需要注意缓存的大小和清理策略,以确保内存使用保持在合理范围内。
评论已关闭