Python @cache 简化无限缓存

2022-08-26  本文已影响0人  HelloHan

Python 内置模块 functools 提供的高阶函数 @functools.cache 是简单轻量级无长度限制的函数缓存,这种缓存有时称为 "memoize"(记忆化)。它是 3.9 新版功能,是在 lru_cache 缓存基础上简化了的对无限长度缓存。

记忆化

记忆化(英语:memoization)是一种提高计算机程序执行速度的优化技术。通过储存大计算量函数的返回值,当这个结果再次被需要时将其从缓存提取,而不用再次计算来节省计算时间。记忆化是一种典型的在计算时间与电脑存储器空间之中获取平衡的方案。在计算中,记忆或记忆化是一种优化技术,主要用于存储大开销函数调用的结果,并在相同输入再次出现时返回缓存结果,从而加速计算机程序。记忆化也用于其他上下文(以及速度增益以外的目的),例如在简单的相互递归下降解析中。虽然与缓存相关,但记忆化是指这种优化的一种特定情况,与缓存形式(如缓冲或缓存文件置换机制)不同。在某些逻辑编程语言的上下文中,记忆化也被称为 tabling。

功能介绍

语法为 @functools.cache(user_function),创建一个查找函数参数的字典的简单包装器。 因为它不需要移出旧值,缓存大小没有限制,所以比带有大小限制的 lru_cache() 更小更快。这个 @cache 装饰器是 Python 3.9 版中的新功能,在此之前,您可以通过 @lru_cache(maxsize=None) 获得相同的效果。

以下是 cache 的实现源码:

<pre style="box-sizing: border-box; overflow: auto; font: 14.4px / 1.5 Consolas, monaco, monospace; margin: 1em 0px; padding: 10px 16px; border-radius: 3px; overflow-wrap: normal;">`from functools import lru_cache

def cache(user_function, /):
'Simple lightweight unbounded cache. Sometimes called "memoize".'
return lru_cache(maxsize=None)(user_function)` </pre>

可以看到它是 lru_cache 缓存对缓存元素无限制的一个简化版本,更多实现细节可以参考 lru_cache 缓存。

案例

官方的例子:

from functools import cache

在一个递归函数上应用 cache 装饰器

@cache
def factorial(n):
return n * factorial(n-1) if n else 1Q

factorial(10) # 没有以前缓存的结果,进行11次递归调用
3628800
factorial(5) # 只是查找缓存值结果
120
factorial(12) # 进行两个新的递归调用,其他10个被缓存
479001600

https://docs.python.org/zh-cn/3.11/library/functools.html#functools.cache

上一篇下一篇

猜你喜欢

热点阅读