Python性能优化利器:lru_cache装饰器详解

简介: Python性能优化利器:lru_cache装饰器详解

Python性能优化利器:lru_cache装饰器详解

在Python开发中,我们经常会遇到函数重复计算相同参数的情况,这时候functools.lru_cache装饰器就能大显身手了。

什么是lru_cache?

lru_cache是Python标准库functools模块提供的装饰器,它能自动缓存函数的调用结果,避免重复计算。LRU代表“最近最少使用”,当缓存达到设定容量时,它会自动淘汰最久未使用的缓存项。

基本使用示例

from functools import lru_cache
import time

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

# 首次计算会慢一些
start = time.time()
print(fibonacci(30))
print(f"耗时: {time.time() - start:.4f}秒")

# 再次计算相同参数时,直接从缓存读取
start = time.time()
print(fibonacci(30))
print(f"耗时: {time.time() - start:.4f}秒")

实际应用场景

  1. 计算密集型函数:如数学计算、数据转换
  2. IO操作缓存:数据库查询、API调用结果
  3. 配置读取:避免重复读取配置文件

注意事项

  • 被装饰的函数参数必须是可哈希的
  • 对于动态变化的数据不适合使用
  • 可以通过cache_clear()方法手动清空缓存

合理使用lru_cache能显著提升程序性能,特别是在递归计算或重复查询场景下。只需一行代码,就能为函数添加智能缓存功能,是Python开发者工具箱中的必备利器。

相关文章
|
5月前
|
缓存 监控 开发工具
用 Python 的 LRU Cache 优化函数性能
用 Python 的 LRU Cache 优化函数性能
437 143
wireshark解析rtp协议,流媒体中的AMR/H263/H264包的方法
抓到完整的流媒体包之后,用wireshark打开,其中的包可能不会自动映射成RTP+AMR/H263/H264的包,做如下修改操作即可:1.  把UDP 包解析成RTP/RTCP包。选中UDP包,右键,选择Decode As,选RTP2.  把RTP Payload映射成实际的媒体格式。
3830 0
|
5月前
|
人工智能 Java Nacos
构建开放智能体生态:AgentScope 如何用 A2A 协议与 Nacos 打通协作壁垒?
AgentScope 全面支持 A2A 协议和 Nacos 智能体注册中心,实现跨语言跨框架智能体互通。
2112 93
|
机器学习/深度学习 人工智能 API
大模型推理服务全景图
国内大模型推理需求激增,性能提升的主战场将从训练转移到推理。
3373 141
|
7月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
55909 11
|
存储 缓存 算法
深入理解Python的`functools.lru_cache`装饰器
在 Python 中,有许多内置的装饰器可以用来增强函数或者类的功能。其中之一就是 `functools.lru_cache` 装饰器。这是一个非常有用的装饰器,它可以帮助我们优化递归函数,避免重复计算已经计算过的值。在这篇文章中,我们将探讨 `functools.lru_cache` 的工作原理以及如何使用它。
|
10月前
|
缓存 JSON 数据库
检验你的fastapi掌握了吗
本内容系统讲解了 FastAPI 的核心功能与高级应用,包括路径参数定义、类型验证、Pydantic 模型、依赖注入、异步处理、权限校验、CORS 配置、错误处理、文档生成及性能优化等内容,适用于构建高效、可维护的现代 Web API 服务。
475 7
Jetson学习笔记(三):多种模型文件的调用部署
文章介绍了如何在Jetson平台上使用torch2trt和onnx2trt工具来部署和调用TensorRT模型。
396 3
|
存储 算法 Android开发
【算法基础】拓扑排序及实战
在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个**有向无环图(DAG,Directed Acyclic Graph)**
1651 0