广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中缓存lru_cache的方法是什么
  • 940
分享到

Python中缓存lru_cache的方法是什么

2023-06-29 00:06:29 940人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要讲解了“python中缓存lru_cache的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中缓存lru_cache的方法是什么”吧!一、前言我们经常谈论的

这篇文章主要讲解了“python缓存lru_cache的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中缓存lru_cache的方法是什么”吧!

一、前言

我们经常谈论的缓存一词,更多的类似于将硬盘中的数据存放到内存中以至于提高读取速度,比如常说的redis,就经常用来做数据的缓存。
Python的缓存(lru_cache)是一种装饰在被执行的函数上,将其执行的结果缓存起来,当下次请求的时候,如果请求该函数的传参未变则直接返回缓存起来的结果而不再执行函数的一种缓存装饰器。

二、举例说明

现在我们先不使用缓存来写一个求两数之和的函数,并调用执行它两次:

def test(a, b):    print('开始计算a+b的值...')    return a + bprint('1+2等于:', test(1, 2))print('1+2等于:', test(1, 2))

执行结果

开始计算a+b的值...
1+2等于: 3
开始计算a+b的值...
1+2等于: 3

可以看到test被执行了两次,现在我们加上缓存再进行执行:

from functools import lru_cache@lru_cachedef test(a, b):    print('开始计算a+b的值...')    return a + bprint(test(1, 2))print(test(1, 2))

执行结果

开始计算a+b的值...
1+2等于: 3
1+2等于: 3

可以看到test函数只被执行了一次,第二次的调用直接输出了结果,使用了缓存起来的值。

当我们使用递归求斐波拉契数列 (斐波那契数列指的是这样一个数列:0,1,1,2,3,5,8,它从第3项开始,每一项都等于前两项之和) 的时候,缓存对性能的提升就尤其明显了:

不使用缓存求第40项的斐波拉契数列

import datetimedef fibonacci(num):# 不使用缓存时,会重复执行函数    return num if num < 2 else fibonacci(num - 1) + fibonacci(num - 2)start = datetime.datetime.now()print(fibonacci(40))end = datetime.datetime.now()print('执行时间', end - start)

执行时间

执行时间 0:00:29.004424

使用缓存求第40项的斐波拉契数列:

import datetimedef fibonacci(num):# 不使用缓存时,会重复执行函数    return num if num < 2 else fibonacci(num - 1) + fibonacci(num - 2)start = datetime.datetime.now()print(fibonacci(40))end = datetime.datetime.now()print('执行时间', end - start)

执行时间

执行时间 0:00:00

两个差距是非常明显的,因为不使用缓存时,相当于要重复执行了很多的函数,而使用了lru_cache则把之前执行的函数结果已经缓存了起来,就不需要再次执行了。

三、lru_cache 用法

1.参数详解

查看lru_cache源码会发现它可以传递两个参数:maxsize、typed:

def lru_cache(maxsize=128, typed=False):    """Least-recently-used cache decorator.    If *maxsize* is set to None, the LRU features are disabled and the cache    can grow without bound...."""

1) maxsize

代表被lru_cache装饰的方法最大可缓存的结果数量 (被装饰方法传参不同一样,则结果不一样;如果传参一样则为同一个结果), 如果不指定传参则默认值为128,表示最多缓存128个返回结果,当达到了128个时,有新的结果要保存时,则会删除最旧的那个结果。如果maxsize传入为None则表示可以缓存无限个结果;

2)typed

默认为false,代表不区分数据类型,如果设置为True,则会区分传参类型进行缓存,官方是这样描述的:

如果typed为True,则将分别缓存不同类型的参数,
例如,f(3.0)和f(3)将被视为具有明显的结果。

但在python3.9.8版本下进行测试,typed为false时,按照官方的测试方法测试得到的还是会被当成不同的结果处理,这个时候typed为false还是为true都会区别缓存,这与官方文档的描述存在差异:

from functools import lru_cache@lru_cachedef test(a):    print('函数被调用了...')    return aprint(test(1.0))print(test(1))

执行结果

函数被调用了...
1.0
函数被调用了...

但如果是多参数的情况下,则会被当成一个结果:

from functools import lru_cache@lru_cachedef test(a, b):    print('函数被调用了...')    return a , bprint(test(1.0, 2.0))print(test(1, 2))

执行结果

函数被调用了...
(1.0, 2.0)
(1.0, 2.0)

这个时候设置typed为true时,则会区别缓存:

from functools import lru_cache@lru_cache(typed=True)def test(a, b):    print('函数被调用了...')    return a , bprint(test(1.0, 2.0))print(test(1, 2))

执行结果

函数被调用了...
(1.0, 2.0)
函数被调用了...
(1, 2)

当传参个数大于1时,才符合官方的说法,不清楚是不是官方举例有误

2. lru_cache不支持可变参数

当传递的参数是dict、list等的可变参数时,lru_cache是不支持的,会报错:

from functools import lru_cache@lru_cachedef test(a):    print('函数被执行了...')    return aprint(test({'a':1}))

报错结果

TypeError: unhashable type: 'dict'

四、lru_cache 与Redis的区别

缓存缓存位置是否支持可变参数是否支持分布式是否支持过期时间设置支持的数据结构需单独安装
redis缓存在redis管理的内存中支持5种数据结构
lru_cache缓存在应用进程的内存中,应用被关闭则被清空字典(参数为:key,结果为:value)

感谢各位的阅读,以上就是“Python中缓存lru_cache的方法是什么”的内容了,经过本文的学习后,相信大家对Python中缓存lru_cache的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Python中缓存lru_cache的方法是什么

本文链接: https://www.lsjlt.com/news/321674.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中缓存lru_cache的方法是什么
    这篇文章主要讲解了“Python中缓存lru_cache的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中缓存lru_cache的方法是什么”吧!一、前言我们经常谈论的...
    99+
    2023-06-29
  • python中自带缓存lru_cache怎么用
    这篇文章给大家分享的是有关python中自带缓存lru_cache怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. lru_cache的使用1.1 参数详解以下是lru_cache方法的实现,我们看出可供...
    99+
    2023-06-20
  • python自带缓存lru_cache用法及扩展的使用
    目录1. lru_cache的使用1.1 参数详解1.2 基本用法1.3 进阶用法2. functiontools.wrap装饰器对lru_cache的影响2.1 多个装饰器装饰同一函数时的执行顺序2.2 funct...
    99+
    2022-06-03
    python自带缓存lru_cache python lru_cache
  • Python中缓存lru_cache的基本介绍和讲解
    目录一、前言二、举例说明三、lru_cache 用法1.参数详解2. lru_cache不支持可变参数四、lru_cache 与redis的区别五、总结一、前言 我们经常谈论的缓存一...
    99+
    2022-11-13
  • PHP+Redis缓存的方法是什么
    本篇内容主要讲解“PHP+Redis缓存的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP+Redis缓存的方法是什么”吧!有否想过PHP使用redis作为缓存时,如何能:前后台模...
    99+
    2023-06-26
  • vps清理缓存的方法是什么
    VPS清理缓存的方法可以通过以下几种方式实现:1. 手动清理缓存:登录VPS后,执行以下命令可以清理缓存:- 清理PageCache...
    99+
    2023-09-08
    vps
  • PHP缓存设置的方法是什么
    PHP缓存设置的方法有多种,以下是其中几种常用的方法:1. 使用PHP内置的缓存控制函数:- ob_start():开启输出缓存- ...
    99+
    2023-08-24
    PHP
  • Ubuntu释放缓存的方法是什么
    今天小编给大家分享一下Ubuntu释放缓存的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Ubuntu释放缓存的方...
    99+
    2023-07-04
  • LRU缓存算法的实现方法是什么
    这篇文章主要讲解了“LRU缓存算法的实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LRU缓存算法的实现方法是什么”吧!LRU就是Least R...
    99+
    2022-10-19
  • php中有什么缓存方法
    这篇文章主要介绍php中有什么缓存方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php中常用的缓存方法有:1、全页面静态化缓存;2、页面部分缓存;3、数据缓存;4、查询缓存;5、按内容变更进行缓存;6、内存式缓存...
    99+
    2023-06-14
  • Linux系统缓存nscd的方法是什么
    本文小编为大家详细介绍“Linux系统缓存nscd的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux系统缓存nscd的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。nscd最主要的作...
    99+
    2023-06-28
  • window清除dns缓存的方法是什么
    在Windows操作系统中,清除DNS缓存的方法如下:1. 打开命令提示符:按下Win+R键,输入cmd,按下回车键。2. 输入以下...
    99+
    2023-06-12
    清除dns缓存
  • tomcat清理缓存文件的方法是什么
    要清理Tomcat的缓存文件,可以按照以下步骤进行操作:1. 停止Tomcat服务器。2. 进入Tomcat的工作目录,该目录通常是...
    99+
    2023-09-16
    tomcat
  • redis实现清空缓存的方法是什么
    这篇文章主要介绍“redis实现清空缓存的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“redis实现清空缓存的方法是什么”文章能帮助大家解决问题。 ...
    99+
    2022-10-19
  • 前端api请求缓存的方法是什么
    这篇文章主要介绍“前端api请求缓存的方法是什么”,在日常操作中,相信很多人在前端api请求缓存的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”前端api请求缓存的...
    99+
    2022-10-19
  • ehcache手动清除缓存的方法是什么
    Ehcache提供了一些方法来手动清除缓存,以下是常用的方法:1. `remove(Object key)`:通过指定缓存键来删除缓...
    99+
    2023-08-26
    ehcache
  • redis分页排序缓存的方法是什么
    Redis 分页排序缓存的方法可以通过使用有序集合(Sorted Set)来实现。1. 首先,将需要排序的数据存储在 Redis 的...
    99+
    2023-09-06
    redis
  • python的redis存取方法是什么
    在Python中,可以使用`redis`模块来操作Redis数据库。Redis提供了一系列的命令,可以通过`redis`模块的方法来...
    99+
    2023-09-11
    python redis
  • ASP.NET缓存数据添加方法是什么
    这篇文章主要介绍“ASP.NET缓存数据添加方法是什么”,在日常操作中,相信很多人在ASP.NET缓存数据添加方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ASP.NET缓存数据添加方法是什么”的疑...
    99+
    2023-06-17
  • Java中的缓存加载算法是什么?
    在Java开发中,缓存是一种非常重要的技术。它可以提高应用程序的性能,减少对后端资源的压力。Java中的缓存加载算法是如何实现的呢?本文将对此进行详细的介绍。 一、什么是缓存加载算法? 在Java中,缓存加载算法指的是一种将数据加载到缓存...
    99+
    2023-09-27
    load 缓存 编程算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作