今天聊一个装饰器lru_cache.关于装饰器的一些内容,前面也做过一定的介绍.简单来说,就是不改变被装饰函数的原有功能,并为其额外增添一些功能.lru_cache是functools模块下的一个装饰器.用法和其他装饰器一样,就是使用lru_cache放在定义的函数上面.lru_cache的主要功能是将函数的调用结果缓存,避免后面重复调用. 核心作用与工作原理.记忆化Memoization当函数被调用时lru_cache 会将输入参数与输出结果进行关联。下次传入相同参数时它会直接返回缓存的结果而不再执行函数体内部的计算。LRU 淘汰策略LRU 全称是“Least Recently Used”最近最少使用。当缓存达到设定的容量上限时它会自动淘汰最久未被访问的缓存条目腾出空间给新数据。底层实现它通常基于“哈希表 双向链表”的数据结构组合能够在 O(1) 的时间复杂度内完成缓存的查找、插入和淘汰操作.在实际开发中lru_cache 特别适合以下场景.递归计算与动态规划例如计算斐波那契数列、树形遍历等。如果不加缓存递归计算会导致大量重复的子问题计算时间复杂度呈指数级增长加上缓存后时间复杂度可降至线性。昂贵的 I/O 操作例如读取配置文件、查询数据库、发起网络 API 请求等。对于短时间内不会频繁变化的数据缓存可以显著减少等待时间。CPU 密集型计算复杂的数学运算、大型字符串处理或图像解析等当输入空间有限且调用频繁时缓存能极大提升性能.尽管 lru_cache 非常强大但在使用时需要注意以下几点必须是纯函数函数不能有副作用如修改全局变量、写入文件、打印日志等。如果函数依赖外部状态或实时数据缓存会导致返回过期的错误结果。参数必须可哈希函数的参数必须是不可变类型如整数、字符串、元组。如果传入列表或字典会抛出 TypeError。解决办法是将列表等转换为元组后再传入.线程安全问题标准的 functools.lru_cache 不是线程安全的。在多线程环境下如果多个线程同时修改链表结构可能会导致数据竞争。如果需要线程安全需手动加锁或使用第三方库如 cachetools)。内存占用如果缓存的函数返回结果非常大或者参数组合极多且未限制 maxsize可能会导致内存溢出.