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 django实现简单的邮件系统发送邮件功能
Jul 14 Python
快速查询Python文档方法分享
Dec 27 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
python 图像平移和旋转的实例
Jan 10 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 Python
Python定义一个Actor任务
Jul 29 Python
超级详细实用的pycharm常用快捷键
May 12 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
使用Python获取字典键对应值的方法
Apr 26 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 array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
php若干单维数组遍历方法的比较
2011/09/20 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
给我一面国旗 python帮你实现
2019/09/30 Python
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
什么是属性访问器
2015/10/26 面试题
刘胡兰的英雄事迹材料
2014/02/11 职场文书
租房协议书
2014/04/10 职场文书
意向协议书范本
2014/04/23 职场文书
公司任命书模板
2014/06/06 职场文书
暑期培训班招生方案
2014/08/26 职场文书
入学证明
2015/06/23 职场文书
总经理聘用协议书
2015/09/21 职场文书
python如何做代码性能分析
2021/04/26 Python
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL