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 24 Python
Python2.7读取PDF文件的方法示例
Jul 13 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
对Django中内置的User模型实例详解
Aug 16 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
python多线程实现TCP服务端
Sep 03 Python
解决Jupyter无法导入已安装的 module问题
Apr 17 Python
基于python实现地址和经纬度转换
May 19 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
Jun 11 Python
基于Python和C++实现删除链表的节点
Jul 06 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
Zend的Registry机制的使用说明
2013/05/02 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
php限制ip地址范围的方法
2015/03/31 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
PHP的自定义模板引擎
2017/03/24 PHP
基于jquery实现三级下拉菜单
2016/05/10 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
干货!教大家如何选择Vue和React
2017/03/13 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
js实现随机数小游戏
2019/06/28 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
python数据结构之链表的实例讲解
2017/07/25 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
python 搜索大文件的实例代码
2019/07/08 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
python装饰器代替set get方法实例
2019/12/19 Python
会议开场欢迎词
2014/01/15 职场文书
简单租房协议书范本
2014/08/20 职场文书
酒店端午节活动方案
2014/08/26 职场文书
金秋助学感谢信
2015/01/21 职场文书
大学推普周活动总结
2015/05/07 职场文书
亮剑观后感500字
2015/06/05 职场文书
小学毕业感言200字
2015/07/30 职场文书
浅谈Python中对象是如何被调用的
2022/04/06 Python