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 控制语句
Nov 03 Python
Python生成随机验证码的两种方法
Dec 22 Python
详解Python迭代和迭代器
Mar 28 Python
Python循环语句中else的用法总结
Sep 11 Python
Python构建XML树结构的方法示例
Jun 30 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
基于python的docx模块处理word和WPS的docx格式文件方式
Feb 13 Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
Nov 17 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 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知道与问问的采集插件代码
2010/10/12 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
JSON取值前判断
2014/12/23 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Django中url的反向查询的方法
2018/03/14 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
增大python字体的方法步骤
2020/07/05 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
Dockers美国官方网站:卡其裤、男士服装、鞋及配件
2016/11/22 全球购物
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
软件测试常见笔试题
2012/02/04 面试题
房产授权委托书范本
2014/09/22 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技
python周期任务调度工具Schedule使用详解
2021/11/23 Python
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫