前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python函数缓存器

Python函数缓存器

作者头像
Autooooooo
发布2020-11-09 10:00:55
8960
发布2020-11-09 10:00:55
举报
文章被收录于专栏:Coxhuang

Python缓存器

#1 环境

代码语言:javascript
复制
Python3.7.3 # Python>=3.2

#2 开始

#2.1 什么是缓存器

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

代码语言:javascript
复制
from functools import lru_cache

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

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

  1. 没有使用缓存
代码语言:javascript
复制
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. 加上缓存
代码语言:javascript
复制
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. 没有使用缓存
代码语言:javascript
复制
def fab(n):

    print(n)

    return None

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

  1. 使用缓存
代码语言:javascript
复制
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) 时,并没有真正执行函数体,而是直接返回缓存的结果。

#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 两个方法,分别用于清除缓存和查看缓存信息。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python缓存器
  • #1 环境
  • #2 开始
    • #2.1 什么是缓存器
      • # 2.2 测试 (斐波那契数列)
        • #2.3 为什么会这样
          • #2.4 lur_cache参数/方法
          相关产品与服务
          云数据库 Redis®
          腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档