讲师中心 微信公众号
AI工具推荐 视频效率加速

怎样在Python中实现LRU缓存?

雨明姑娘_3670

雨明姑娘_3670

发布时间:2025-05-29 16:00:02

|

1092人浏览过

|

来源于php中文网

原创

在python中实现lru缓存可以使用collections.ordereddict或functools.lru_cache。1. 使用ordereddict实现lrucache类,通过move_to_end和popitem方法管理缓存。2. 使用lru_cache装饰器简洁实现缓存,如@lru_cache(maxsize=128)装饰函数。选择方法需考虑灵活性和简洁性。

怎样在Python中实现LRU缓存?

在Python中实现LRU(Least Recently Used,最近最少使用)缓存的需求在很多实际应用场景中都非常常见,比如Web缓存、数据库查询缓存等。LRU缓存的核心思想是当缓存达到容量上限时,淘汰最久未被访问的数据项。

那么,怎样在Python中实现LRU缓存呢?我们可以使用Python的标准库collections中的OrderedDict来实现一个基础的LRU缓存,也可以利用functools中的lru_cache装饰器来实现一个更简洁的LRU缓存。下面我会详细介绍这两种方法,并分享一些我自己在实际项目中使用LRU缓存的心得和踩过的坑。

首先,让我们从基础的OrderedDict实现开始。这种方法虽然代码量较大,但可以让我们更好地理解LRU缓存的原理。

立即学习“Python免费学习笔记(深入)”;

from collections import OrderedDict

class LRUCache:
    def __init__(self, capacity):
        self.capacity = capacity
        self.cache = OrderedDict()

    def get(self, key):
        if key not in self.cache:
            return -1
        self.cache.move_to_end(key)
        return self.cache[key]

    def put(self, key, value):
        if key in self.cache:
            self.cache.move_to_end(key)
        self.cache[key] = value
        if len(self.cache) > self.capacity:
            self.cache.popitem(last=False)

这个实现利用了OrderedDict的特性,它不仅保持了键值对的顺序,还提供了move_to_end方法来将最近访问的项移动到末尾。当缓存容量超出时,我们使用popitem(last=False)来删除最久未使用的项。

在实际使用中,我发现这种方法的优点在于灵活性高,可以根据需求定制缓存的行为。比如,我曾在一个项目中需要对某些键进行优先级管理,就在这个基础上增加了优先级队列的功能。然而,缺点也很明显:代码量较大,维护成本高。

提示词大师-python版
提示词大师-python版

图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍

下载

相比之下,使用functools.lru_cache装饰器则要简洁得多。以下是一个简单的示例:

from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

这种方法的优点在于简洁易用,只需一行装饰器就能实现LRU缓存。不过,它的灵活性不如OrderedDict实现,无法对缓存行为进行细粒度的控制。

在实际项目中,我曾遇到过一个问题:当使用lru_cache时,如果函数的参数是不可哈希的(比如列表),会导致缓存失效。这让我意识到,在选择LRU缓存实现时,需要考虑数据类型的哈希性。

关于性能优化,我建议在使用LRU缓存时,合理设置maxsize参数。过小的maxsize可能导致频繁的缓存淘汰,影响性能;过大的maxsize则可能导致内存占用过高。通过性能测试来找到最佳的maxsize值是非常重要的。

此外,在多线程环境下,lru_cache默认是线程安全的,但OrderedDict实现则需要自己处理线程安全问题。我曾在一个并发访问频繁的系统中,使用了threading.Lock来保证OrderedDict实现的线程安全性。

总的来说,选择哪种LRU缓存实现方法取决于具体的需求。如果你需要高度的灵活性和定制性,OrderedDict实现是不错的选择;如果你追求简洁和快速上手,lru_cache装饰器则更为合适。在实际应用中,理解LRU缓存的工作原理,并根据具体场景进行优化和调整,是提升系统性能的重要一环。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2511

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

514

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

422

2026.02.12

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3658

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1029

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

363

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

519

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

369

2026.02.06

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn