python实现LRU算法

LRU算法python实现

​ 学习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 = {}

    # 定义查询数据的函数
    def get(self, key):
        # 当key不在字典中时
        if key not in self.lru_dict:
            return None
        else:
            # 把数据先删再赋值,使其添加到entries数组末尾
            self.lru_dict[key] = self.lru_dict.pop(key)

    # 定义添加数据的函数
    def set(self, key, value):
        # 当key在字典中时重复上述操作
        if key in self.lru_dict:
            # 删掉老数据
            self.lru_dict.pop(key)
            # 存入新值
            self.lru_dict[key] = value
        else:
            # 当缓存满了的时候
            if len(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())

>>> {5: 50, 6: 60, 7: 70, 8: 80, 9: 90} dict_keys([5, 6, 7, 8, 9])
>>> {6: 60, 8: 80, 9: 90, 5: 50, 7: 70} 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对象才能指定剔除使用最少的数组头部数据。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值