lru_cache装饰器
lru_cache
是Python标准库中的一个装饰器,可以用于缓存函数的结果,有几个比较有意思的特性:
lru_cache
会将函数的参数和返回值存储在一个字典中,以便在下次调用时可以直接返回结果,而不必重新计算。lru_cache
有两个可选参数:maxsize
和typed
。maxsize
指定缓存的大小,而typed
指定是否对不同类型的参数使用不同的缓存。lru_cache
使用LRU(最近最少使用)算法来管理缓存。当缓存达到最大大小时,它会删除最近最少使用的条目。lru_cache
只能用于不可变参数的函数。如果函数有可变参数,则不适用。
举个例子
下面的例子中,假设db_query
是一个比较耗时的数据库操作,而且希望加载以后,就从缓存中读取,不要频繁的访问数据库,可以给函数db_query
加上一个lru_cache
的装饰器,这样,在第一次读取以后,key和值就被缓存了,下次再访问的时候,就会从缓存中读取。
在下面的例子中,限制了缓存的最大数量是3,当缓存第4个元素的时候,就会把其中的一个元素移除,下次再访问被移除的元素时,就会再次调用真正的查询操作。
from functools import lru_cache
@lru_cache(maxsize=3)
def db_query(key: str)->str:
#假如这是个数据库查询的函数,比较耗时,我们希望加载一次以后就从缓存中读取
print(f'execute db_query {key}')
return f"this is {key}'s value"
if __name__ == '__main__':
print(db_query("k1"))
print(db_query("k1"))
print(db_query("k2"))
print(db_query("k3"))
print(db_query("k4"))
print(db_query("k1"))
execute db_query k1
this is k1's value
this is k1's value
execute db_query k2
this is k2's value
execute db_query k3
this is k3's value
execute db_query k4
this is k4's value
execute db_query k1
this is k1's value
注意
虽然这种方式使用起来很方便,但是还是要注意它的局限性,对于缓存后有变化的情况,就不太适合采用这种方式,因为变化的值无法更新到缓存中,所以这个装饰器仅适合于类似于配置信息或者这其他在启动后只加载一次的数据。