Python functools lru_cache是否缓存函数参数及返回结果?
关于
lru_cache装饰器的缓存逻辑疑问 示例代码
from functools import lru_cache @lru_cache(maxsize=256) def task_a(a, b): print(f'Multiplying {a} and {b}') return a*b print(task_a(2, 3)) print(task_a(2, 3)) print(task_a(2, 4)) print(task_a(2, 4)) print(task_a(2, 5)) print(task_a(2, 5))
运行输出
Multiplying 2 and 3 6 6 Multiplying 2 and 4 8 8 Multiplying 2 and 5 10 10
疑问解答
lru_cache是将函数参数作为键、对应的返回结果作为值,一起存入缓存的,它的工作逻辑如下:
- 首次调用函数时,会执行函数体代码,计算出返回结果,同时把本次调用的参数组合作为键、返回结果作为值,存入内部缓存容器。
- 后续用完全相同的参数调用函数时,装饰器会先检查缓存中是否存在该参数对应的键。如果存在,直接取出对应的返回结果返回,不会再执行函数体代码——这就是你示例中第二次调用相同参数时,没有打印
Multiplying...语句的原因。
拿你的代码举例:第一次调用task_a(2,3)时,执行函数打印语句并返回6,缓存中会记录(2,3):6;第二次调用该参数时,直接从缓存取出6返回,跳过了函数体的执行,因此没有打印内容。
内容的提问来源于stack exchange,提问作者Deepak Tatyaji Ahire
相关产品推荐
相关产品推荐

