Python函数缓存器

Python缓存器

#1 环境

Python3.7.3 # Python>=3.2

#2 开始

#2.1 什么是缓存器

平时常听说使用redis做缓存,但是redis换缓存存放的是结果数据,从Python 的 3.2 版本开始,引入了一个非常优雅的缓存机器

from functools import lru_cache

lru_cache 可以提高程序执行的效率,特别适合于耗时的函数,只需要在需要的函数加上装饰器,就可以达到缓存的效果,特别是一些递归函数

# 2.2 测试 (斐波那契数列)

  1. 没有使用缓存
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秒??

  1. 加上缓存
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秒??

#2.3 为什么会这样

做个小测试

  1. 没有使用缓存
def fab(n):

    print(n)

    return None

fab(10)
fab(10)
fab(10)

20190524143018-image.png


  1. 使用缓存
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)

20190524143209-image.png


从结果可以看出,当第二次调用 fab(10) 时,并没有真正执行函数体,而是直接返回缓存的结果。

#2.4 lur_cache参数/方法

使用functools模块的lur_cache装饰器,可以缓存最多 maxsize 个此函数的调用结果,从而提高程序执行的效率,特别适合于耗时的函数。参数maxsize为最多缓存的次数,如果为None,则无限制,设置为2n时,性能最佳;如果 typed=True(注意,在 functools32 中没有此参数),则不同参数类型的调用将分别缓存,例如 f(3) 和 f(3.0)。
被 lru_cache 装饰的函数会有 cache_clear 和 cache_info 两个方法,分别用于清除缓存和查看缓存信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值