作業系統 :CentOS 7.6.1810_x64
Python 版本 : 3.9.12
使用python開發過程中,會遇到需要使用快取加速應用的情況,比如下面這些場景:
資料轉換加速
字串時間轉換成int時間戳;
字串時間轉換成datetime型別;
...
資料解析加速
bytes資料轉換為int(封包解析場景的埠、序列號等);
bytes資料轉換為string(封包解析場景的ip地址等);
...
本文提供兩種實現方式來加速應用,這裡記錄下,希望對你有幫助。
實現思路:
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
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 獲取。
這裡演示下兩種實現方式的具體效果,並做下對比。
測試程式碼:
執行效果:
執行時間:15.046 秒
測試程式碼:
執行效果:
執行時間: 28.934秒
結論:
lru-dict庫比較快。
說明:
1)使用OrderedDict實現LRU的優點在於不用安裝額外的庫;
2)lru-dict是使用c語言開發的第三方庫,需要使用pip進行安裝,效能比較好,但和平臺相關性比較強;
本文涉及範例程式碼及whl檔案,可從百度網路硬碟獲取:
https://pan.baidu.com/s/1N6wWHhMkvXcyVI5mEhn1JA
關注微信公眾號(聊聊博文,文末可掃碼)後回覆 2023031901 獲取。