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 03 Python
Python实现Linux的find命令实例分享
Jun 04 Python
使用python实现接口的方法
Jul 07 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
浅析Python数据处理
May 02 Python
python dict 相同key 合并value的实例
Jan 21 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
May 18 Python
基于Tensorflow一维卷积用法详解
May 22 Python
keras实现多种分类网络的方式
Jun 11 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 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实现每天自动变换随机问候语的方法
2015/05/12 PHP
php统计数组元素个数的方法
2015/07/02 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
Node.js 基础教程之全局对象
2017/08/06 Javascript
简单实现jQuery轮播效果
2017/08/18 jQuery
jquery+css实现下拉列表功能
2017/09/03 jQuery
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
详解用JS添加和删除class类名
2019/03/25 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
vue实现计算器功能
2020/02/22 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
浅析Python语言自带的数据结构有哪些
2019/08/27 Python
Python @property使用方法解析
2019/09/17 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
python em算法的实现
2020/10/03 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
个人自荐信
2013/12/05 职场文书
大学新生军训感言
2014/02/25 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
2015年度女工工作总结
2015/10/22 职场文书
php去除deprecated的实例方法
2021/11/17 PHP