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实现绘制树枝简单示例
Jul 24 Python
Python爬虫模拟登录带验证码网站
Jan 22 Python
Python中的单继承与多继承实例分析
May 10 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
python中map的基本用法示例
Sep 10 Python
python编程使用协程并发的优缺点
Sep 20 Python
对pycharm 修改程序运行所需内存详解
Dec 03 Python
python xpath获取页面注释的方法
Jan 14 Python
使用Bazel编译TensorBoard教程
Feb 15 Python
区分python中的进程与线程
Aug 13 Python
详解python爬取弹幕与数据分析
Nov 14 Python
python定义具名元组实例操作
Feb 28 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
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
PHP实现远程下载文件到本地
2015/05/17 PHP
Java中final关键字详解
2015/08/10 PHP
PHP安全下载文件的方法
2016/04/07 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
php 可变函数使用小结
2018/06/12 PHP
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
js实现拖拽功能
2017/03/01 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
JS验证码实现代码
2017/09/14 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
python中dir函数用法分析
2015/04/17 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
python进行两个表格对比的方法
2018/06/27 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
酒店管理毕业生自荐信
2013/10/24 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
管理工程专业求职信
2014/08/10 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
2014五年级班主任工作总结
2014/12/05 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书