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中__call__用法实例
Aug 29 Python
Python函数式编程指南(四):生成器详解
Jun 24 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
Python获取某一天是星期几的方法示例
Jan 17 Python
python实现远程通过网络邮件控制计算机重启或关机
Feb 22 Python
使用python 3实现发送邮件功能
Jun 15 Python
Django添加sitemap的方法示例
Aug 06 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
Python Django的安装配置教程图文详解
Jul 17 Python
python输出结果刷新及进度条的实现操作
Jul 13 Python
Python中rapidjson参数校验实现
Jul 25 Python
基于python定位棋子位置及识别棋子颜色
Jul 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 echo()函数讲解
2019/02/15 PHP
PHP中16个高危函数整理
2019/09/19 PHP
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
python求pi的方法
2014/10/08 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
python模块smtplib学习
2018/05/22 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
python给微信好友定时推送消息的示例
2019/02/20 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
三个python爬虫项目实例代码
2019/12/28 Python
通过实例学习Python Excel操作
2020/01/06 Python
使用Python pip怎么升级pip
2020/08/11 Python
python mock测试的示例
2020/10/19 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
高三体育教学反思
2014/01/29 职场文书
运动会开幕式邀请函
2014/02/03 职场文书
服装发布会策划方案
2014/05/22 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
浅谈MySQL函数
2021/10/05 MySQL
5个实用的JavaScript新特性
2022/06/16 Javascript