翼度科技»论坛 编程开发 python 查看内容

使用LRU加速python应用

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
操作系统 :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操作; 
示例代码如下 :
  1. from collections import OrderedDict
  2. class LRU:
  3.     def __init__(self, func, maxsize=128):
  4.         self.func = func
  5.         self.maxsize = maxsize
  6.         self.cache = OrderedDict()
  7.     def __call__(self, *args):
  8.         if args in self.cache:
  9.             value = self.cache[args]
  10.             self.cache.move_to_end(args)
  11.             return value
  12.         value = self.func(*args)
  13.         if len(self.cache) >= self.maxsize:
  14.             self.cache.popitem(False)
  15.         self.cache[args] = value
  16.         return value
复制代码
2、使用lru-dict库实现LRU

pypi地址:https://pypi.org/project/lru-dict/
github地址:https://github.com/amitdev/lru-dict

 
安装lru-dict库:
  1. pip install lru-dict
复制代码
示例代码:
  1. from lru import LRU
  2. l = LRU(5)         # Create an LRU container that can hold 5 items
  3. print l.peek_first_item(), l.peek_last_item()  #return the MRU key and LRU key
  4. # Would print None None
  5. for i in range(5):
  6.    l[i] = str(i)
  7. print l.items()    # Prints items in MRU order
  8. # Would print [(4, '4'), (3, '3'), (2, '2'), (1, '1'), (0, '0')]
  9. print l.peek_first_item(), l.peek_last_item()  #return the MRU key and LRU key
  10. # Would print (4, '4') (0, '0')
  11. l[5] = '5'         # Inserting one more item should evict the old item
  12. print l.items()
  13. # 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 获取。

来源:https://www.cnblogs.com/MikeZhang/p/2023031901-pythonLRUTest.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具