Python函数记忆化有四种方法:一、用functools.lru_cache装饰器;二、手动维护字典缓存;三、用闭包封装缓存状态;四、基于类实现可调用记忆化对象,支持清空缓存等功能。

如果希望 Python 函数在多次调用中保留并复用之前计算过的参数与结果,可借助记忆化(memoization)机制避免重复运算。以下是实现该功能的多种方法:
一、使用 functools.lru_cache 装饰器
这是 Python 标准库提供的轻量级记忆化工具,自动缓存函数调用结果,基于参数哈希值进行键匹配,适用于纯函数场景。
1、在函数定义前添加 @lru_cache() 装饰器。
2、确保函数所有参数均为不可变类型(如 int、str、tuple),否则会触发 TypeError: unhashable type。
立即学习“Python免费学习笔记(深入)”;
3、可选地传入 maxsize 参数控制缓存容量,例如 @lru_cache(maxsize=128)。
二、手动维护字典缓存
通过在函数外部或内部绑定一个字典对象,显式存储参数元组到返回值的映射关系,适用于需自定义缓存逻辑或调试追踪的场景。
1、在函数定义外初始化一个空字典,例如 _cache = {}。
2、函数内部将 args 和 kwargs 转换为可哈希键,常用方式是 key = (args, tuple(sorted(kwargs.items())))。
3、检查 key 是否已在 _cache 中,若存在则直接返回对应值;否则执行原逻辑并将结果存入 _cache。
三、使用闭包封装状态
通过嵌套函数创建独立作用域,使缓存字典不暴露于全局命名空间,增强封装性与线程安全性(配合锁可进一步强化)。
1、定义外层函数接收原始函数作为参数,并初始化局部字典 cache = {}。
2、内层函数接收任意参数,构造键并查表,命中则返回缓存值,未命中则调用原始函数并将结果写入 cache。
3、外层函数返回内层函数,完成装饰器行为。
四、基于类的可调用记忆化对象
将缓存逻辑封装为类实例,支持重置缓存、查看统计信息、设置过期策略等扩展能力。
1、定义类并实现 __init__ 方法,初始化 self.cache = {} 和 self.func 属性。
2、实现 __call__ 方法,使其可像函数一样被调用,内部完成键生成、缓存查找与更新。
3、添加 clear() 方法用于清空当前缓存。










