Python缓存技术,装x新高度。
一段非常简单代码
普通调用方式
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]>
ok,今天的内容就到这里,赶紧去试一试吧
Python缓存技术,装x新高度。的更多相关文章
- python中的缓存技术
python缓存技术 def console(a,b): print('进入函数') return (a,b) print(console(3,'a')) print(console(2,'b')) ...
- 【转】图片缓存之内存缓存技术LruCache、软引用 比较
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- 网站缓存技术(Redis、Memcached、Ehcache)
Redis 是什么? 通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等等. 分类的标准也不一,Redis本质上也是一种键值数据库的,但它在保持键值数据库简单快捷特点 ...
- Web前后端缓存技术(缓存的主要作用是什么)
Web前后端缓存技术Web前后端缓存技术(缓存的主要作用是什么) 一.总结 一句话总结: 加快页面打开速度 减少网络带宽消耗 降低服务器压力 1.在Web应用中,应用缓存的地方有哪些? 主要有浏览器缓 ...
- 网站缓存技术总结( ehcache、memcache、redis对比)
网站技术高速发展的今天,缓存技术已经成为大型网站的一个关键技术,缓存设计好坏直接关系的一个网站访问的速度,以及购置服务器的数量,甚至影响到用户的体验. 网站缓存按照存放的地点不同,可以分为客户端缓存. ...
- .Net环境下的缓存技术介绍 (转)
.Net环境下的缓存技术介绍 (转) 摘要:介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1 概念 ...
- [.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术
[.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率 ...
- 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...
- .Net环境下的缓存技术介绍
.Net环境下的缓存技术介绍 摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1 概念 1.1 ...
随机推荐
- shell的sed命令
sed命令用于在线编辑文本,它一次处理一行内容. 命令语法: sed [-n/e/f/r/i] [cmd] [InFile] 参数解释: 选项与参数: -n: quiet/silent,安静模式,经过 ...
- R1 学习记录
libevent框架学习特点: 1.可移植行,跨平台的 2.速度快,libevent会用各平台最快的非阻塞IO函数 3.扩展性 4.方便性构成: 1.evutil: 抽象出各平台network的函数 ...
- win7右下角的同步中心怎么去除
“开始”-“运行”-“regedit”,在“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Syncmgr\Handlers” ...
- 51nod 1483 化学变换 | 二进制 暴力
51nod 1483 化学变换 题面 给出n个整数(n <= 1e5,每个数 <= 1e5),对每个数都可以进行多次操作,操作有两种:乘二/整除以二. 问最少经过多少次操作能使所有数相等. ...
- 理解 OAuth 2.0
理解OAuth 2.0 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 一.简介 OAuth是一个关于授权(authorization)的开 ...
- Chapter12(动态内存)--C++Prime笔记
1.分配再静态或栈内存中的对象由编译器自动创建销毁. 2.C++中动态内存的管理是通过 new:前者为对象非配空间并返回一个指向该对象的指针. delete:接受一个动态对象的指针,摧毁该对象,并释放 ...
- composer安装第三方库出现需要认证信息等原因
最近,在学习使用thinkcmf的时候,使用composer安装第三方类库,遇到了需要输入验证码的问题,援引https://laravel-china.org/topics/17893该链接中的讨论, ...
- linux那些事
useradd -m -d /home/changp -Gusers,dialout,video account_name 创建新的账号 passwd account_name 修改指定账号的密码
- D65光源
D65光源是标准光源中最常用的人工日光,其色温为6500K.英文名:Artificial Daylight 6500K.标准光源箱中的D65光源是模拟人工日光,保证在室内.阴雨天观测物品的颜色效果时, ...
- linux(ubuntu) mysql安装使用
简单的安装一下: sudo apt-get install mysql-server apt-get isntall mysql-client sudo apt-get install libmysq ...