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中列表(list)操作方法汇总
Aug 18 Python
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
python异常处理和日志处理方式
Dec 24 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
Python ArgumentParse的subparser用法说明
Apr 20 Python
Python基于当前时间批量创建文件
May 07 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 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
php后退一页表单内容保存实现方法
2012/06/17 PHP
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
使用jQuery实现购物车
2020/10/29 jQuery
Python中return语句用法实例分析
2015/08/04 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
django做form表单的数据验证过程详解
2019/07/26 Python
python中np是做什么的
2020/07/21 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
学校司机岗位职责
2013/11/14 职场文书
初一生物教学反思
2014/01/18 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
无偿献血倡议书
2014/04/14 职场文书
《赶海》教学反思
2014/04/20 职场文书
慈善晚会策划方案
2014/05/14 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
Python读取和写入Excel数据
2022/04/20 Python
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL