使用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 ...
随机推荐
- JavaScript 调用Bomb后端云
用简单的代码 展示代码的魅力 Bmob 是后端云 全方位一体化的后端服务平台 提供可靠的 Server ...
- CCF 202012-2 期末预测之最佳阈值
#include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...
- pytest与allure的使用
--需要先安装pytest [1]数据驱动@pytest.mark.parametrize: @pytest.mark.parametrize只对于同一用例不同数据的传参 ①只有一个参数时 datat ...
- 前端入门知识点笔记本之js重定位函数
1. call().bind().apply()的用法,改变this的指向,区别在于f.call(obj, arg1, arg2...),f.bind(obj, arg1, arg2,...)(),f ...
- 1903021126 申文骏 Java 第二周作业 代码编写及运行
项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 Java第二周作业 博客名称 1903021126 申文骏 Java 第二周作业 代码编写及运行 要求 每道题要有题目,代码(使用插入代 ...
- Eclipse 搭建一个简单的SpringBoot+WebSocket环境
WebSocket是一种在单个TCP连接上进行全双工通信的协议. WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范. WebSocket API也被 ...
- Linux挂载tf卡空间
https://blog.csdn.net/cao849861802/article/details/126039190
- 记录Echarts官网打开慢的解决方法
进入C:\Windows\System32\drivers\etc: 在hosts文件里添加 151.101.2.132 echarts.apache.org
- spring security添加接口白名单
在项目中遇到的问题是要将某个接口设为白名单,无需验证即可被用户使用. 解决方法: 在nacos配置文件中ignore whites(不校验白名单)中添加对应接口,无gateway前缀即可,添加立即生效 ...
- 网易二面-Arthas的底层原理
众所周知,阿里开源的Arthas已经成为Java开发中调优的基本工具,其功能在于监控JVM运行情况,并对CPU.内存状况生成报告或者是火炬图. 从JDK5开始,java.lang.instrument ...