用 Python 实现 LRU 缓存机制(不使用 functools.lru_cache)

实现一个 LRU(Least Recently Used,最近最少使用)缓存机制,可以通过使用  collections.OrderedDict 来方便地管理缓存中的元素顺序。 OrderedDict 保持了插入顺序,因此我们可以利用这个特性来实现 LRU 缓存。

下面是一个简单的 LRU 缓存实现:

pythonCopy Codefrom collections import OrderedDictclass LRUCache:    def __init__(self, capacity: int):
        self.cache = OrderedDict()
        self.capacity = capacity    def get(self, key: int) -> int:        if key not in self.cache:            return -1
        else:            # Move the accessed item to the end to show that it was recently used
            self.cache.move_to_end(key)            return self.cache[key]    def put(self, key: int, value: int) -> None:        if key in self.cache:            # Update the existing key and move it to the end
            self.cache.move_to_end(key)
        self.cache[key] = value        if len(self.cache) > self.capacity:            # Pop the first item (least recently used)
            self.cache.popitem(last=False)# 使用示例lru_cache = LRUCache(2)
lru_cache.put(1, 1)
lru_cache.put(2, 2)print(lru_cache.get(1))  # 输出: 1lru_cache.put(3, 3)      # 该操作会使得键 2 作废print(lru_cache.get(2))  # 输出: -1 (未找到)lru_cache.put(4, 4)      # 该操作会使得键 1 作废print(lru_cache.get(1))  # 输出: -1 (未找到)print(lru_cache.get(3))  # 输出: 3print(lru_cache.get(4))  # 输出: 4

代码说明:

  • OrderedDict‌:用于存储缓存的键值对,并保持它们的访问顺序。
  • get 方法‌:检查键是否存在于缓存中。如果存在,将该键移动到  OrderedDict 的末尾以标记为最近使用,并返回其值。如果不存在,返回  -1
  • put 方法‌:如果键已存在,更新其值并将其移动到末尾。如果键不存在,直接添加。如果添加后缓存大小超过容量,则移除最早插入的键值对(即  OrderedDict 的第一个元素)。
  • 容量管理‌:通过检查  OrderedDict 的长度与设定的容量,确保缓存不会超出指定的大小。

这种实现方式简单且高效,适用于需要手动管理缓存顺序的场景。


http://wangluo.zgjzs.org

http://zhineng.zgjzs.org

http://gaosu.zgjzs.org

http://anquan.zgjzs.org

http://wangzhan.zgjzs.org

http://jiaoyu.zgjzs.org

http://guanggao.zgjzs.org

http://shuju.zgjzs.org

http://zhifu.zgjzs.org

http://yingyong.zgjzs.org

http://yonghu.zgjzs.org

http://houtai.zgjzs.org

http://fenxi.zgjzs.org

http://jiekou.zgjzs.org

http://fenxiang.zgjzs.org

http://neirong.zgjzs.org

http://zhuce.zgjzs.org

http://tongji.zgjzs.org

http://ditu.zgjzs.org

http://tuisong.zgjzs.org

http://gouwu.zgjzs.org

http://tuiguang.zgjzs.org

http://shejiao.zgjzs.org

http://zhongguo.zgjzs.org

http://wangguan.zgjzs.org

http://yule.zgjzs.org

http://pingtai.zgjzs.org

http://jichu.zgjzs.org

http://wangjie.zgjzs.org

http://zhishi.zgjzs.org

http://shangcheng.zgjzs.org

http://dianzi.zgjzs.org

http://yinyue.zgjzs.org

http://tupian.zgjzs.org

http://shipin.zgjzs.org

http://wuliu.zgjzs.org

http://gongju.zgjzs.org

http://anquan.zgjzs.org

http://sousuo.zgjzs.org

http://mima.zgjzs.org

http://jiankong.zgjzs.org

http://ceshi.zgjzs.org

http://wangyou.zgjzs.org

http://zixun.zgjzs.org

http://chajian.zgjzs.org

http://kuaidi.zgjzs.org

http://liuliang.zgjzs.org

http://zhengce.zgjzs.org

http://peizhi.zgjzs.org

http://baocun.zgjzs.org

http://yonghu.shangpin.org

http://houtai.shangpin.org

http://pingtai.shangpin.org

http://wangzhan.shangpin.org

http://zhifu.shangpin.org

http://guanggao.shangpin.org

http://yinyue.shangpin.org

http://zixun.shangpin.org

http://shejiao.shangpin.org

http://tuisong.shangpin.org

http://wangguan.shangpin.org

http://zhineng.shangpin.org

http://wangluo.shangpin.org

http://anquan.shangpin.org

http://zhongguo.shangpin.org

http://shuju.shangpin.org

http://jiekou.shangpin.org

http://zhishi.shangpin.org

http://gongneng.shangpin.org

http://tongji.shangpin.org

http://shipin.shangpin.org

http://jiaoyu.shangpin.org

http://ditu.shangpin.org

http://dianzi.shangpin.org

http://mima.shangpin.org

http://liuliang.shangpin.org

http://gouwu.shangpin.org

http://zhengce.shangpin.org

http://yule.shangpin.org

http://baocun.shangpin.org

http://jichu.shangpin.org

http://fenxi.shangpin.org

http://fenxiang.shangpin.org

http://shangcheng.shangpin.org

http://kuaidi.shangpin.org

http://peizhi.shangpin.org

http://wuliu.shangpin.org

http://ceshi.shangpin.org

http://tupian.shangpin.org

http://wangyou.shangpin.org

http://chajian.shangpin.org

http://tuiguang.shangpin.org

http://yingyong.shangpin.org

http://zhuce.shangpin.org

http://sousuo.shangpin.org

http://jiankong.shangpin.org

http://neirong.shangpin.org

http://gongju.shangpin.org

http://zonghe.shangpin.org

http://zhifu.snjrw.org

http://houtai.snjrw.org

http://yule.snjrw.org

http://wangluo.snjrw.org

http://guanggao.snjrw.org

http://shuju.snjrw.org

http://pingtai.snjrw.org

http://ditu.snjrw.org

http://wangzhan.snjrw.org

http://shejiao.snjrw.org

http://jiekou.snjrw.org

http://zhishi.snjrw.org

http://zhineng.snjrw.org

http://jiaoyu.snjrw.org

http://zhongguo.snjrw.org

http://yinyue.snjrw.org

http://yonghu.snjrw.org

http://tuiguang.snjrw.org

http://gouwu.snjrw.org

http://baocun.snjrw.org

http://fenxiang.snjrw.org

http://fenxi.snjrw.org

http://gongneng.snjrw.org

http://wangguan.snjrw.org

http://zixun.snjrw.org

http://dianzi.snjrw.org

http://tupian.snjrw.org

http://wangyou.snjrw.org

http://chajian.snjrw.org

http://wuliu.snjrw.org

http://mima.snjrw.org

http://liuliang.snjrw.org

http://zhuce.snjrw.org

http://zhengce.snjrw.org

http://peizhi.snjrw.org

http://shipin.snjrw.org

http://jichu.snjrw.org

http://tongji.snjrw.org

http://kuaidi.snjrw.org

http://yingyong.snjrw.org

http://sousuo.snjrw.org

http://jiankong.snjrw.org

http://neirong.snjrw.org

http://gongju.snjrw.org

http://tuisong.snjrw.org

http://shangcheng.snjrw.org

http://anli.snjrw.org

http://dianhua.snjrw.org

http://fuwu.snjrw.org

请使用浏览器的分享功能分享到微信等