使用LRU加速python应用
操作系统 :CentOS 7.6.1810_x64
Python 版本 : 3.9.12
一、背景描述
使用python开发过程中,会遇到需要使用缓存加速应用的情况,比如下面这些场景:
数据转换加速
字符串时间转换成int时间戳;
字符串时间转换成datetime类型;
...
数据解析加速
bytes数据转换为int(数据包解析场景的端口、序列号等);
bytes数据转换为string(数据包解析场景的ip地址等);
...
本文提供两种实现方式来加速应用,这里记录下,希望对你有帮助。
二、具体实现
1、使用python自带的OrderedDict实现LRU
实现思路:
1)使用OrderedDict作为缓存,并设置大小;
2)第一次解析时,将解析结果加入缓存;
3)缓存元素数量超过设定数量,执行pop操作;
示例代码如下 :
from collections import OrderedDict
class LRU: def __init__(self, func, maxsize=128):
self.func = func
self.maxsize = maxsize
self.cache = OrderedDict() def __call__(self, *args):
if args in self.cache:
value = self.cache[args]
self.cache.move_to_end(args)
return value
value = self.func(*args)
if len(self.cache) >= self.maxsize:
self.cache.popitem(False)
self.cache[args] = value
return value
2、使用lru-dict库实现LRU
pypi地址:https://pypi.org/project/lru-dict/
github地址:https://github.com/amitdev/lru-dict

安装lru-dict库:
pip install lru-dict
示例代码:
from lru import LRU
l = LRU(5) # Create an LRU container that can hold 5 items print l.peek_first_item(), l.peek_last_item() #return the MRU key and LRU key
# Would print None None for i in range(5):
l[i] = str(i)
print l.items() # Prints items in MRU order
# Would print [(4, '4'), (3, '3'), (2, '2'), (1, '1'), (0, '0')] print l.peek_first_item(), l.peek_last_item() #return the MRU key and LRU key
# Would print (4, '4') (0, '0') l[5] = '5' # Inserting one more item should evict the old item
print l.items()
# Would print [(5, '5'), (4, '4'), (3, '3'), (2, '2'), (1, '1')]
由于lru-dict库是使用c实现的,使用源代码安装可能存在环境问题,可直接使用pypi上面提供的预编译whl文件:

说明:
1)源码包为 lru-dict-1.1.8.tar.gz;
2)本文使用的whl文件是 lru_dict-1.1.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl ;
3)可从以下途径获取上述文件:
关注微信公众号(聊聊博文,文末可扫码)后回复 2023031901 获取。
三、运行效果
这里演示下两种实现方式的具体效果,并做下对比。
1、测试用例1(lru库实现)
测试代码:

运行效果:

运行时间:15.046 秒
2、测试用例2( OrderedDict实现)
测试代码:

运行效果:

运行时间: 28.934秒
结论:
lru-dict库比较快。
说明:
1)使用OrderedDict实现LRU的优点在于不用安装额外的库;
2)lru-dict是使用c语言开发的第三方库,需要使用pip进行安装,性能比较好,但和平台相关性比较强;
四、资源下载
本文涉及示例代码及whl文件,可从百度网盘获取:
https://pan.baidu.com/s/1N6wWHhMkvXcyVI5mEhn1JA

关注微信公众号(聊聊博文,文末可扫码)后回复 2023031901 获取。
使用LRU加速python应用的更多相关文章
- 用Cython加速Python程序以及包装C程序简单测试
用Cython加速Python程序 我没有拼错,就是Cython,C+Python=Cython! 我们来看看Cython的威力,先运行下边的程序: import time def fib(n): i ...
- 使用numba加速python程序
前面说过使用Cython来加速python程序的运行速度,但是相对来说程序改动较大,这次就说一种简单的方式来加速python计算速度的方法,就是使用numba库来进行,numba库可以使用JIT技术即 ...
- 加速github、kaggle访问、加速python packge下载更改源
OS: WIN10 加速github.kaggle访问 使用站长DNS工具(http://tool.chinaz.com/dns) 查询响应速度最快的网站服务器IP,将网站服务器IP和域名添加到电脑h ...
- 用 Numba 加速 Python 代码
原文出自微信公众号:Python那些事 一.介绍 pip install numba Numba 是 python 的即时(Just-in-time)编译器,即当你调用 python 函数时,你的全部 ...
- 使用numba加速python科学计算
技术背景 python作为一门编程语言,有非常大的生态优势,但是其执行效率一直被人诟病.纯粹的python代码跑起来速度会非常的缓慢,因此很多对性能要求比较高的python库,需要用C++或者Fort ...
- numba jit加速python程序
numba numba加速循环.numpy的一些运算,大概是将python和numpy的一些代码转化为机器代码,速度飞快! 加速耗时很长的循环时: from numba import jit # 在函 ...
- Numba加速Python程序
众所周知,Python和Java一样是基于虚拟机的语言,并不是像C/C++那样将程序代码编译成机器语言再运行,而是解释一行执行一行,速度比较慢.使用Numba库的JIT技术编译以后,可以明显提高程序的 ...
- 用Cython加速Python代码
安装Cython pip install Cython 如何使用 要在我们的笔记本中使用Cython,我们将使用IPython magic命令.Magic命令以百分号开始,并提供一些额外的功能,这些功 ...
- 使用pypy3加速python运行
从这里下载对应OS版本的安装包 解压: tar xf pypy-x.y.z.tar.bz2 然后通过./pypy-x.y.z/bin/pypy可以直接进入console 可以使用pip安装包: ./p ...
- 使用国内镜像源来加速python pypi包的安装
pipy国内镜像目前有: http://pypi.douban.com/ 豆瓣 http://pypi.mirrors.ustc.edu.cn/ 中国科学技术大学 安装时,使用-i参数 pip i ...
随机推荐
- 请求接口类型blob,下载文件
axiosGet () { var This = this var url = '/group1/M00/00/21/MejEvGOX_zOAL2kiAAAAUhB5Iqg138.txt?token= ...
- python机器学习——线性回归方法
背景与原理: 线性回归是机器学习建模中最为简单的模型,也是计算起来最为直观的模型 所谓线性回归,我们要建立的是这样的模型:对一组数据,每组数据形如$(x_{1},...,x_{n},y)$,我们希望构 ...
- TypeError: Cannot read property ‘$options‘ of undefined vue
vue弹框页面 <el-form :model="ruleForm" ref="ruleForm" label-width="100px&quo ...
- 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告4
中国人民公安大学 Chinese people' public security university 网络对抗技术 实验报告 实验四 恶意代码技术 学生姓名 陈禹 年级 2018 区队 ...
- scala流程控制
1.分支控制if-else 分支控制有三种:单分支.双分支.多分支: 1.1 单分支 (1).语法入下: if(条件表达式){ 执行代码块 //当条件表达式为true时,才会执行代码块内容 ...
- svg矢量二维码加盖在PDF文件中
正常行驶的bitmap类型的二维码格式,加载到PDF中,将会导致二维码失真,无法扫描. 矢量图可根据尺寸大小进行调节,不会出现失真模糊情况 所用依赖 <PackageReference Incl ...
- IP协议数据包
Header Length:头部长度固定20字节,永远为5(4bit为单位) Total Length:头部+包, 抓包结果 Identification.Fragment Flags.Fragmen ...
- Two Sum:给出一个整数数组,返回两个数的下标值,令其和等于一个指定的目标值 #Leetcode
// Given nums = [2, 7, 11, 15], target = 9, // Because nums[0] + nums[1] = 2 + 7 = 9, // return [0, ...
- 十大经典排序之快速排序(C++实现)
快速排序 通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 思路: (1)选择基准:从数列中挑出一个 ...
- FCC 中级算法题 数组扁平化
Steamroller 对嵌套的数组进行扁平化处理.你必须考虑到不同层级的嵌套. Array.isArray() 思路: (1)遍历arr,如果arr[i]是数组,就重新调用本函数继续循环,然后和新数 ...