Python装饰器进阶:用闭包打造智能缓存函数

简介: Python装饰器进阶:用闭包打造智能缓存函数

Python装饰器进阶:用闭包打造智能缓存函数

装饰器是Python中强大的语法糖,它允许在不修改原函数代码的情况下增强功能。今天我们来实现一个实用的缓存装饰器,用于优化重复计算场景的性能。

import functools
from datetime import datetime, timedelta

def cache_with_ttl(ttl_seconds=300):
    """带过期时间的缓存装饰器"""
    def decorator(func):
        cache = {
   }

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

            # 检查缓存是否有效
            if key in cache:
                result, timestamp = cache[key]
                if datetime.now() - timestamp < timedelta(seconds=ttl_seconds):
                    return result

            # 执行函数并缓存结果
            result = func(*args, **kwargs)
            cache[key] = (result, datetime.now())
            return result

        return wrapper
    return decorator

# 使用示例
@cache_with_ttl(ttl_seconds=60)  # 缓存60秒
def expensive_computation(x, y):
    """模拟耗时计算"""
    import time
    time.sleep(2)
    return x * y + x**2

这个装饰器的核心原理是利用闭包特性,在装饰器内部维护一个缓存字典。每次调用函数时,先检查参数是否已缓存且未过期,如果是则直接返回缓存结果,避免重复计算。

关键点解析:

  1. functools.wraps 保留原函数元信息
  2. 闭包三层结构实现参数化装饰器
  3. 字典键由函数参数唯一确定
  4. 时间戳实现TTL(生存时间)机制

适用场景:

  • 数据库查询结果缓存
  • API接口响应缓存
  • 复杂计算结果的复用
  • 减少外部服务调用频率

这种模式在Web开发、数据处理等场景中非常实用,能够显著提升程序性能。掌握装饰器的灵活运用,能让你的Python代码更加优雅高效。

装饰器的本质是函数式编程思想的体现,通过组合而非修改来扩展功能,这也是Python语言哲学的重要组成部分。

目录
相关文章
|
监控 网络协议 Java
Linux 网络编程从入门到进阶 学习指南
在上一篇文章中,我们探讨了 Linux 系统编程的诸多基础构件,包括文件操作、进程管理和线程同步等,接下来,我们将视野扩展到网络世界。在这个新篇章里,我们要让应用跳出单机限制,学会在网络上跨机器交流信息。
Linux 网络编程从入门到进阶 学习指南
|
3月前
|
缓存 监控 测试技术
Python装饰器:让代码更优雅的“魔法”
Python装饰器:让代码更优雅的“魔法”
249 114
|
3月前
|
数据采集 API 数据处理
Python异步编程入门:告别阻塞,拥抱高效IO
Python异步编程入门:告别阻塞,拥抱高效IO
218 113
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
1263 2
|
3月前
|
存储 芯片
南京观海微电子---经典继电器驱动电路方案:单片机IO端口、三极管、达林顿管及嵌套连接
本文详解继电器工作原理及单片机驱动电路设计,涵盖四种经典驱动方案:IO口直驱、三极管驱动(NPN/PNP)、达林顿管驱动及继电器套娃方案,结合实际应用与面试常见问题,深入剖析电路设计要点与注意事项。
南京观海微电子---经典继电器驱动电路方案:单片机IO端口、三极管、达林顿管及嵌套连接
|
7月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
476 18
|
7月前
|
关系型数据库 MySQL 数据库
为什么 MySQL 不推荐用 Docker 部署?
本文探讨了MySQL是否适合容器化的问题,分析了Docker容器在数据安全、性能瓶颈、状态管理及资源隔离等方面的挑战,并指出目前主流分布式数据库如TDSQL和OceanBase仍倾向于部署在物理机或KVM上。
357 0
空口资源 | 带你读《5G 空口设计与实践进阶 》之十四
NR对空口物理资源的划分包括 3 个维度,即时域、频域和空域。为了满足各种差异化应用场景的要求,NR 在对“时—频—空”物理资源的管理上,除继承 LTE 的基础外,也进行了大量的革新,包括自适应的波形、更为灵活的帧结构、可配置的参数集、部分带宽等。
空口资源 | 带你读《5G 空口设计与实践进阶 》之十四
|
安全 算法 Java
代码质量和安全使用代码检测提升
云效代码管理提供多种内置扫描服务,确保代码质量与安全性。面对编码不规范、敏感数据泄露、依赖项安全漏洞等问题,该服务从代码提交到合并全程保驾护航。不仅依据《阿里巴巴 Java 开发手册》检查编码规范,还利用先进算法智能推荐代码补丁,检测敏感信息及依赖包漏洞。用户可在每次提交或合并请求时选择自动化扫描,快速定位并解决问题,提升研发流程的稳定性与安全性。立即体验云效代码管理,保障代码健康。
340 12
|
关系型数据库 MySQL 数据库
TDSQL技术详解
一个基本的TDSQL实例的创建和操作流程。对于更高级的特性和最佳实践
1355 0
TDSQL技术详解

热门文章

最新文章