操作系统 :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应用的更多相关文章

  1. 用Cython加速Python程序以及包装C程序简单测试

    用Cython加速Python程序 我没有拼错,就是Cython,C+Python=Cython! 我们来看看Cython的威力,先运行下边的程序: import time def fib(n): i ...

  2. 使用numba加速python程序

    前面说过使用Cython来加速python程序的运行速度,但是相对来说程序改动较大,这次就说一种简单的方式来加速python计算速度的方法,就是使用numba库来进行,numba库可以使用JIT技术即 ...

  3. 加速github、kaggle访问、加速python packge下载更改源

    OS: WIN10 加速github.kaggle访问 使用站长DNS工具(http://tool.chinaz.com/dns) 查询响应速度最快的网站服务器IP,将网站服务器IP和域名添加到电脑h ...

  4. 用 Numba 加速 Python 代码

    原文出自微信公众号:Python那些事 一.介绍 pip install numba Numba 是 python 的即时(Just-in-time)编译器,即当你调用 python 函数时,你的全部 ...

  5. 使用numba加速python科学计算

    技术背景 python作为一门编程语言,有非常大的生态优势,但是其执行效率一直被人诟病.纯粹的python代码跑起来速度会非常的缓慢,因此很多对性能要求比较高的python库,需要用C++或者Fort ...

  6. numba jit加速python程序

    numba numba加速循环.numpy的一些运算,大概是将python和numpy的一些代码转化为机器代码,速度飞快! 加速耗时很长的循环时: from numba import jit # 在函 ...

  7. Numba加速Python程序

    众所周知,Python和Java一样是基于虚拟机的语言,并不是像C/C++那样将程序代码编译成机器语言再运行,而是解释一行执行一行,速度比较慢.使用Numba库的JIT技术编译以后,可以明显提高程序的 ...

  8. 用Cython加速Python代码

    安装Cython pip install Cython 如何使用 要在我们的笔记本中使用Cython,我们将使用IPython magic命令.Magic命令以百分号开始,并提供一些额外的功能,这些功 ...

  9. 使用pypy3加速python运行

    从这里下载对应OS版本的安装包 解压: tar xf pypy-x.y.z.tar.bz2 然后通过./pypy-x.y.z/bin/pypy可以直接进入console 可以使用pip安装包: ./p ...

  10. 使用国内镜像源来加速python pypi包的安装

    pipy国内镜像目前有: http://pypi.douban.com/  豆瓣 http://pypi.mirrors.ustc.edu.cn/  中国科学技术大学 安装时,使用-i参数 pip i ...

随机推荐

  1. MySQL经典45题

    一.数据库字段说明 1.学生表 Student(SId,Sname,Sage,Ssex)SId :学生编号Sname:学生姓名Sage :出生年月Ssex:学生性别 2.课程表 Course(CId, ...

  2. Kubernetes--管理Pod对象的容器(2)

    自定义运行的容器化应用 由Docker镜像启动容器时运行的应用程序在相应的Dockerfile中由ENTRYPOINT指令进行定义,传递给程序的参数则通过CMD指令指定,ENTRYPOINT指令不存在 ...

  3. HTML初体验之各种标签练习

    HTML初体验之各种标签练习 首先是<!DOCTYPE>标签 放在网页顶部的doctype声明是让浏览器进入正确呈现模式的关键.浏览器自动切换到恰当的呈现模式,以便正确显示由doctype ...

  4. spring session + redis实现共享session

    一.代码 1.pom.xml <!--spring session--> <dependency> <groupId>org.springframework.boo ...

  5. phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)(Kali)

    ​  phpMyAdmin是一套开源的.基于Web的MySQL数据库管理工具.其index.php中存在一处文件包含逻辑,通过二次编码即可绕过检查,造成远程文件包含漏洞. 通过vulhub靶场进行复现 ...

  6. a标签做锚点定位,有部分内容被置顶头部遮挡的解决方法

    被遮挡的元素添加如下样式: /**这里假定头部高度是100px*/ position: relative;top: 100px;/**关键样式如下,我这里上面有加定位,如果没用定位,下面的数值需根据实 ...

  7. PowerDesigner 从数据库生成实体模型关键步骤

  8. 关闭Google自动更新

    一.禁用任务计划 二.禁用更新服务 三.重命名更新程序 首先找到谷歌浏览器的安装位置

  9. 当前SAT主要关键技术及其相关文献2022-11-1

    摘录自: Tasniem Nasser Al-Yahya, Mohamed El Bachir Menai, Hassan Mathkour:Boosting the Performance of C ...

  10. base64与中文字符串互转

    实现代码如下 // 字符串转base64 getEncode64(str){ return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g ...