Python3.7.3 # Python>=3.2
平时常听说使用redis做缓存,但是redis换缓存存放的是结果数据,从Python 的 3.2 版本开始,引入了一个非常优雅的缓存机器
from functools import lru_cache
lru_cache 可以提高程序执行的效率,特别适合于耗时的函数,只需要在需要的函数加上装饰器,就可以达到缓存的效果,特别是一些递归函数
def fab(n):
if n <=2:
return n
return fab(n-1) + fab(n-2)
print(datetime.datetime.now()) # 2019-05-24 14:21:43
fab(40)
print(datetime.datetime.now()) # 2019-05-24 14:22:20
当没有使用缓存时,fab(40)运行的时间大约需要37秒??
from functools import lru_cache
import datetime
@lru_cache(None)
def fab(n):
if n <=2:
return n
return fab(n-1) + fab(n-2)
print(datetime.datetime.now()) # 2019-05-24 14:24:00.229715
fab(40)
print(datetime.datetime.now()) # 2019-05-24 14:24:00.229823
当加上缓存后,执行fab(40)需要的时间不到1秒??
做个小测试
def fab(n):
print(n)
return None
fab(10)
fab(10)
fab(10)
from functools import lru_cache
@lru_cache(None)
def fab(n):
print(n)
return None
fab(10)
fab(10)
fab(10)
fab(9)
fab(9)
从结果可以看出,当第二次调用 fab(10) 时,并没有真正执行函数体,而是直接返回缓存的结果。
使用functools模块的lur_cache装饰器,可以缓存最多 maxsize 个此函数的调用结果,从而提高程序执行的效率,特别适合于耗时的函数。参数maxsize为最多缓存的次数,如果为None,则无限制,设置为2n时,性能最佳;如果 typed=True(注意,在 functools32 中没有此参数),则不同参数类型的调用将分别缓存,例如 f(3) 和 f(3.0)。 被 lru_cache 装饰的函数会有 cache_clear 和 cache_info 两个方法,分别用于清除缓存和查看缓存信息。