操作系统 :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. 请求接口类型blob,下载文件

    axiosGet () { var This = this var url = '/group1/M00/00/21/MejEvGOX_zOAL2kiAAAAUhB5Iqg138.txt?token= ...

  2. python机器学习——线性回归方法

    背景与原理: 线性回归是机器学习建模中最为简单的模型,也是计算起来最为直观的模型 所谓线性回归,我们要建立的是这样的模型:对一组数据,每组数据形如$(x_{1},...,x_{n},y)$,我们希望构 ...

  3. TypeError: Cannot read property ‘$options‘ of undefined vue

    vue弹框页面 <el-form :model="ruleForm" ref="ruleForm" label-width="100px&quo ...

  4. 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告4

    中国人民公安大学 Chinese people' public security university 网络对抗技术 实验报告   实验四 恶意代码技术     学生姓名 陈禹 年级 2018 区队 ...

  5. scala流程控制

    1.分支控制if-else 分支控制有三种:单分支.双分支.多分支: 1.1 单分支 (1).语法入下: if(条件表达式){ 执行代码块       //当条件表达式为true时,才会执行代码块内容 ...

  6. svg矢量二维码加盖在PDF文件中

    正常行驶的bitmap类型的二维码格式,加载到PDF中,将会导致二维码失真,无法扫描. 矢量图可根据尺寸大小进行调节,不会出现失真模糊情况 所用依赖 <PackageReference Incl ...

  7. IP协议数据包

    Header Length:头部长度固定20字节,永远为5(4bit为单位) Total Length:头部+包, 抓包结果 Identification.Fragment Flags.Fragmen ...

  8. Two Sum:给出一个整数数组,返回两个数的下标值,令其和等于一个指定的目标值 #Leetcode

    // Given nums = [2, 7, 11, 15], target = 9, // Because nums[0] + nums[1] = 2 + 7 = 9, // return [0, ...

  9. 十大经典排序之快速排序(C++实现)

    快速排序 通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 思路: (1)选择基准:从数列中挑出一个 ...

  10. FCC 中级算法题 数组扁平化

    Steamroller 对嵌套的数组进行扁平化处理.你必须考虑到不同层级的嵌套. Array.isArray() 思路: (1)遍历arr,如果arr[i]是数组,就重新调用本函数继续循环,然后和新数 ...