Python缓存技术实现过程详解


Posted in Python onSeptember 25, 2019

一段非常简单代码

普通调用方式

def console1(a, b):
  print("进入函数")
  return (a, b)

print(console1(3, 'a'))
print(console1(2, 'b'))
print(console1(3.0, 'a'))

很简单的一段代码,传入两个参数。然后打印输出。输出结果

进入函数
(3, 'a')
进入函数
(2, 'b')
进入函数
(3.0, 'a')

使用某个装饰器后

接下来我们引入functools模块的lru_cache,python3自带模块。

from functools import lru_cache
@lru_cache()
def console2(a, b):
  print("进入函数")
  return (a, b)
print(console2(3, 'a'))
print(console2(2, 'b'))
print(console2(3.0, 'a'))

ほら、惊喜来了。

进入函数
(3, 'a')
进入函数
(2, 'b')
(3, 'a')

我们发现,少了一次进入函数的打印,这是怎么回事呢?这就是接下来要说的LRU缓存技术了。

我们理解下什么是LRU

LRU (Least Recently Used) 是缓存置换策略中的一种常用的算法。当缓存队列已满时,新的元素加入队列时,需要从现有队列中移除一个元素,LRU 策略就是将最近最少被访问的元素移除,从而腾出空间给新的元素。

python中的实现

python3中的functools模块的lru_cache实现了这个功能,lru_cache装饰器会记录以往函数运行的结果,实现了备忘(memoization)功能,避免参数重复时反复调用,达到提高性能的作用,在递归函数中作用特别明显。这是一项优化技术,它把耗时的函数的结果保存起来,避免传入相同的参数时重复计算。

带参数的lru_cache

使用方法lru_cache(maxsize=128, typed=False)maxsize可以缓存最多个此函数的调用结果,从而提高程序执行的效率,特别适合于耗时的函数。参数maxsize为最多缓存的次数,如果为None,则无限制,设置为2的n次幂时,性能最佳;如果 typed=True,则不同参数类型的调用将分别缓存,例如 f(3) 和 f(3.0),默认False来一段综合代码:

from functools import lru_cache

def console1(a, b):
  print("进入函数")
  return (a, b)


@lru_cache()
def console2(a, b):
  print("进入函数")
  return (a, b)


@lru_cache(maxsize=256, typed=True)
def console3(a, b):
  '''

  :param a:
  :param b:
  :return:
  '''
  print("进入函数")
  return (a, b)


print(console1(3, 'a'))
print(console1(2, 'b'))
print(console1(3.0, 'a'))
print("*" * 40)
print(console2(3, 'a'))
print(console2(2, 'b'))
print(console2(3.0, 'a'))
print("*" * 40)
print(console3(3, 'a'))
print(console3(2, 'b'))
print(console3(3.0, 'a'))

同样的可以用到爬虫的去重操作上,避免网页的重复请求。在后期存储的时候做判断即可。

from functools import lru_cache
from requests_html import HTMLSession
session=HTMLSession()
@lru_cache()
def get_html(url):
  req=session.get(url)
  print(url)
  return req

urllist=["https://www.baidu.com","https://pypi.org/project/pylru/1.0.9/","https://www.baidu.com"]

if __name__ == '__main__':
  for i in urllist:
    print(get_html(i))

输出

https://www.baidu.com
<Response [200]>
https://pypi.org/project/pylru/1.0.9/
<Response [200]>
<Response [200]>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编码时应该注意的几个情况
Mar 04 Python
Python 备份程序代码实现
Mar 06 Python
Python进程间通信Queue实例解析
Jan 25 Python
Python requests库用法实例详解
Aug 14 Python
python多进程控制学习小结
Oct 31 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
Python assert关键字原理及实例解析
Dec 13 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
python实现小程序推送页面收录脚本
Apr 20 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
Jul 01 Python
利用Opencv实现图片的油画特效实例
Feb 28 Python
Python中Selenium对Cookie的操作方法
Jul 09 Python
Laravel框架表单验证格式化输出的方法
Sep 25 #Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
Sep 25 #Python
python 用户交互输入input的4种用法详解
Sep 24 #Python
python getpass实现密文实例详解
Sep 24 #Python
使用Python的turtle模块画国旗
Sep 24 #Python
给你一面国旗 教你用python画中国国旗
Sep 24 #Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 #Python
You might like
建立动态的WML站点(三)
2006/10/09 PHP
php下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
Php图像处理类代码分享
2012/01/19 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
图片自动缩小 点击放大
2008/07/07 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
Django之模型层多表操作的实现
2019/01/08 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
捐资助学倡议书
2014/04/15 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
看上去很美观后感
2015/06/10 职场文书
运动会广播稿20字
2015/08/19 职场文书
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python
nginx搭建NFS网络文件系统
2022/04/14 Servers