Python中缓存lru_cache的方法是什么
导读:本文共3140字符,通常情况下阅读需要10分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 一、前言我们经常谈论的缓存一词,更多的类似于将硬盘中的数据存放到内存中以至于提高读取速度,比如常说的redis,就经常用来做数据的缓存。Python的缓存(lru_cache)是一种装饰在被执行的函数上,将其执行的结果缓存起来,当下次请求的时候,如果请求该函数的传参未变则直接返回缓存起来的结果而不再执行函数的一种缓存装饰器。二、举例说明1.现在我们先不使用缓存来... ...
目录
(为您整理了一些要点),点击可以直达。我们经常谈论的缓存一词,更多的类似于将硬盘中的数据存放到内存中以至于提高读取速度,比如常说的redis,就经常用来做数据的缓存。
Python的缓存(lru_cache)是一种装饰在被执行的函数上,将其执行的结果缓存起来,当下次请求的时候,如果请求该函数的传参未变则直接返回缓存起来的结果而不再执行函数的一种缓存装饰器。
1.现在我们先不使用缓存来写一个求两数之和的函数,并调用执行它两次:
执行结果
开始计算a+b的值...
1+2等于: 3
开始计算a+b的值...
1+2等于: 3
可以看到test被执行了两次,现在我们加上缓存再进行执行:
执行结果
开始计算a+b的值...
1+2等于: 3
1+2等于: 3
可以看到test函数只被执行了一次,第二次的调用直接输出了结果,使用了缓存起来的值。
2.当我们使用递归求斐波拉契数列 (斐波那契数列指的是这样一个数列:0,1,1,2,3,5,8,它从第3项开始,每一项都等于前两项之和) 的时候,缓存对性能的提升就尤其明显了:
不使用缓存求第40项的斐波拉契数列
执行时间
执行时间 0:00:29.004424
使用缓存求第40项的斐波拉契数列:
执行时间
执行时间 0:00:00
两个差距是非常明显的,因为不使用缓存时,相当于要重复执行了很多的函数,而使用了lru_cache则把之前执行的函数结果已经缓存了起来,就不需要再次执行了。
查看lru_cache源码会发现它可以传递两个参数:maxsize、typed:
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都会区别缓存,这与官方文档的描述存在差异:
执行结果
函数被调用了...
1.0
函数被调用了...
但如果是多参数的情况下,则会被当成一个结果:
执行结果
函数被调用了...
(1.0, 2.0)
(1.0, 2.0)
这个时候设置typed为true时,则会区别缓存:
执行结果
函数被调用了...
(1.0, 2.0)
函数被调用了...
(1, 2)
当传参个数大于1时,才符合官方的说法,不清楚是不是官方举例有误
当传递的参数是dict、list等的可变参数时,lru_cache是不支持的,会报错:
报错结果
TypeError: unhashable type: 'dict'
Python中缓存lru_cache的方法是什么的详细内容,希望对您有所帮助,信息来源于网络。