python實現LRU演算法

2021-10-08 23:24:46 字數 2084 閱讀 9568

​ 學習mysql資料庫時,了解了一下ib_buffer_pool的儲存機制,使用lru演算法施行將少用的資料淘汰,儲存使用更頻繁的資料。

​ 再基於3.6版本python的字典資料型別改變,想試試新字典預設有序的話能否直接使用於lru演算法。

from collections import ordereddict

class

lrulru_dict()

:def

__init__

(self, capacity)

:# 傳入快取容量

self.capacity = capacity

# 新建字典

self.lru_dict =

# 定義查詢資料的函式

defget

(self, key)

:# 當key不在字典中時

if key not

in self.lru_dict:

return

none

else

:# 把資料先刪再賦值,使其新增到entries陣列末尾

self.lru_dict[key]

= self.lru_dict.pop(key)

# 定義新增資料的函式

defset

(self, key, value)

:# 當key在字典中時重複上述操作

if key in self.lru_dict:

# 刪掉老資料

self.lru_dict.pop(key)

# 存入新值

self.lru_dict[key]

= value

else

:# 當快取滿了的時候

iflen

(self.lru_dict)

== self.capacity:

#  這裡如果繼續使用字典結構dict.popitem實行的是末尾淘汰,不能申明last欄位

# 只能呼叫ordereddict強轉再操作

self.lru_dict = ordereddict(self.lru_dict)

self.lru_dict.popitem(last=

false

)# 新增新值

self.lru_dict[key]

= value

c = lrulru_dict(5)

for i in

range(5

,10):

c.set(i,

10* i)

print

(c.lru_dict, c.lru_dict.keys())

c.get(5)

c.get(7)

print

(c.lru_dict, c.lru_dict.keys())

c.set(10

,100

)print

(c.lru_dict, c.lru_dict.keys())

c.set(9

,44)print

(c.lru_dict, c.lru_dict.keys())

>>

>

dict_keys([5

,6,7

,8,9

])>>

>

dict_keys([6

,8,9

,5,7

])>>

> ordereddict([(

8,80)

,(9,

90),(

5,50)

,(7,

70),(

10,100)

]) odict_keys([8

,9,5

,7,10

])>>

> ordereddict([(

8,80)

,(5,

50),(

7,70)

,(10,

100),(

9,44)

]) odict_keys([8

,5,7

,10,9

])

所以仍需使用orderdict物件才能指定剔除使用最少的陣列頭部資料。

LRU演算法實現

jdk 中的實現 在jdk 中linkedhashmap 可以作為lru 演算法以及插入順序的實現,linkedhashmap 繼承自hashmap 底層結合hash 表和雙向鍊錶,元素的插入和查詢等操作通過計算hash 值找到其陣列位置,在做插入或則查詢操作是,將元素插入到鍊錶的表頭 當然得先刪除...

LRU演算法的實現

0 推薦 lru演算法的實現 什麼是lru演算法lru是least recently used的縮寫,即最近最少使用頁面置換演算法,是為虛擬頁式儲存管理服務的.關於作業系統的記憶體管理,如何節省利用容量不大的記憶體為最多的程序提供資源,一直是研究的重要方向.而記憶體的虛擬儲存管理,是現在最通用,最成...

簡單實現演算法LRU

lru的主要思想基本是,設定乙個固定大小的容器,不斷新增元素。當容器放滿時,把最前面的元素清除,在對尾新增新元素,如果元素是重複的元素,則找出那個元素放到隊尾。lru演算法主要步驟是 1.判斷新元素的key是否在lru中,如果在,就把此元素找出來然後拿到鍊錶尾部 2.判斷元素是否填滿到指定大小,如果...