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小程序
Aug 15 Python
python读取word文档的方法
May 09 Python
Python与Java间Socket通信实例代码
Mar 06 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
Django 路由控制的实现代码
Nov 08 Python
python pandas时序处理相关功能详解
Jul 03 Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
python 带时区的日期格式化操作
Oct 23 Python
地图可视化神器kepler.gl python接口的使用方法
Dec 22 Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 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中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
php 注释规范
2012/03/29 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
JavaScript实现世界各地时间显示
2020/09/07 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
python如何实现excel数据添加到mongodb
2015/07/30 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
Python中qutip用法示例详解
2020/10/02 Python
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
企业统计员岗位职责
2013/12/13 职场文书
英语道歉信范文
2014/01/09 职场文书
万年牢教学反思
2014/02/15 职场文书
会计专业自荐信
2014/06/03 职场文书
在校生证明
2015/06/17 职场文书
pytorch 如何使用batch训练lstm网络
2021/05/28 Python
Nginx四层负载均衡的配置指南
2021/06/11 Servers
javascript对象3个属性特征
2021/11/17 Javascript