用Python装饰器优雅实现函数缓存

简介: 用Python装饰器优雅实现函数缓存

用Python装饰器优雅实现函数缓存

装饰器是Python中一项强大而优雅的特性,它允许在不修改原函数代码的情况下增加新功能。今天我们来探讨如何使用装饰器实现一个简单的函数缓存机制。

什么是函数缓存?

函数缓存是将函数调用结果存储起来,当使用相同参数再次调用时直接返回缓存结果,避免重复计算。这对于计算成本高、频繁调用的函数尤其有用。

实现代码

import functools
from typing import Dict, Any

def cache_decorator(func):
    """简单的缓存装饰器"""
    cache: Dict[str, Any] = {
   }

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        # 创建缓存键
        cache_key = str(args) + str(kwargs)

        # 检查是否已有缓存
        if cache_key in cache:
            print(f"使用缓存结果: {cache_key}")
            return cache[cache_key]

        # 执行函数并缓存结果
        result = func(*args, **kwargs)
        cache[cache_key] = result
        print(f"计算并缓存: {cache_key}")

        return result

    return wrapper

# 使用装饰器
@cache_decorator
def fibonacci(n: int) -> int:
    """计算斐波那契数列"""
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 测试
if __name__ == "__main__":
    print(fibonacci(10))  # 首次计算
    print(fibonacci(10))  # 使用缓存

代码解析

这个装饰器通过字典存储函数调用结果,缓存键由参数转换而来。functools.wraps确保装饰后的函数保留原函数的元数据。在递归调用场景中(如斐波那契数列),缓存能显著提升性能。

应用场景

  • 计算密集型函数
  • 数据库查询结果缓存
  • API调用结果缓存
  • 递归函数优化

Python标准库中的functools.lru_cache提供了更完善的实现,但理解其原理有助于我们更好地利用这一特性。装饰器的这种应用展现了Python“内置电池”哲学的魅力——用简洁的语法解决实际问题。

相关文章
|
5月前
|
云安全 安全 网络安全
阿里云安全体系与安全类云产品主要功能解读
阿里云构建多层次安全防护体系,覆盖物理安全、网络安全、数据安全等层面,提供DDoS防护、WAF、数据加密、MFA等全系列安全云产品。其产品具备自主研发技术、灵活配置、持续更新等优势,满足金融、电商、政府等行业多样化安全需求。例如,金融行业通过DDoS防护与数据加密保障业务稳定;电商平台利用WAF抵御恶意攻击。用户还可通过领取优惠券降低安全投入成本。阿里云将持续技术创新,优化服务,构建安全生态,为用户提供高效可靠的安全解决方案。
374 1
|
项目管理 开发者 Windows
【KiCad镜像】下载与安装
KiCad EDA 是一款用于印刷电路板设计的开源自由软件,基于 GPLv3 开源协议。 软件包含工程项目管理、原理图设计、线路板绘制、符号库设计、封装库设计、线路板 3D 显示、Gerber 查看、线路板实用计算等工具。
1318 121
|
5月前
|
Python
Python f-string:让字符串格式化变得优雅简洁
Python f-string:让字符串格式化变得优雅简洁
343 138
|
监控 Kubernetes 负载均衡
spring boot应用优化,6s内启动,内存减半
taptap-developer是一个spring boot框架驱动的纯Grpc服务,所以,只用了四步,移除了web和spring cloud相关的模块后,启动速度就稳稳的保持在了6s内。除了启动速度提升外,在服务待机状态下,内存锐减了50%左右,从500M左右的内存占用,缩减到了250M不到。
10313 113
spring boot应用优化,6s内启动,内存减半
|
存储 分布式计算 安全
基于OSS的EB级数据湖
数据湖无缝对接多种计算分析平台,对Hadoop生态支持良好,存储在数据湖中的数据可以直接对其进行数据分析、处理、查询,通过对数据深入挖掘与分析,洞察数据中蕴含的价值。
基于OSS的EB级数据湖
|
5月前
|
SQL 安全 数据库
SQL注入:从登录框到数据泄露的十分钟
SQL注入:从登录框到数据泄露的十分钟
362 140
|
5月前
|
数据采集 缓存 数据可视化
RFID生产治具全流程追溯信息化管控
RFID技术实现治具全生命周期可视化追溯,覆盖采购、领用、使用、维护至报废各环节,打破信息孤岛。通过实时数据采集与分析,提升调度效率,降低闲置与丢失风险,延长使用寿命,减少重复采购。结合ERP、MES等系统,构建标准化管理流程,满足汽车、电子等行业合规追溯要求,助力企业降本增效。
|
5月前
|
安全 数据库连接 开发者
不止 with open:Python 上下文管理器的高级玩法
不止 with open:Python 上下文管理器的高级玩法
299 137
|
5月前
|
JSON JavaScript API
Python数据解析实战:用json模块轻松处理API数据
Python数据解析实战:用json模块轻松处理API数据
317 134
|
5月前
|
存储 缓存 人工智能
KV缓存:被低估的AI推理加速神器
KV缓存:被低估的AI推理加速神器
568 136