python缓存机制——lru_cache() / cache
缓存
缓存是一种将定量数据加以保存以备迎合后续获取需求的处理方式,旨在加快数据获取的速度。数据的生成过程可能需要经过计算,规整,远程获取等操作,如果是同一份数据需要多次使用,每次都重新生成会大大浪费时间。所以,如果将计算或者远程请求等操作获得的数据缓存下来,会加快后续的数据获取需求。
lru_cache
简介
functools模块中lru_cache是非常实用的装饰器,它实现了缓存,去重的功能。它将耗时的函数结果保存起来,避免传入相同的参数重复计算。LRU三个字母是 "Least Recently Used" 的缩写,表明缓存不会无限储存,一段时间不用,或者数量超出一定限制,旧缓存就会扔掉。
使用场景
深度优先搜素(dfs)等频繁调用函数的情景中。
@lru_cache()必须在def()函数前一行使用
示例
力扣周赛298P4
卖木头快
class Solution:
def sellingWood(self, m: int, n: int, prices: List[List[int]]) -> int:
@lru_cache(None)
def dfs(x, y):
res = d.get((x, y), 0)#如果木头块价格不在价格列表中则为0
for i in range(1, x//2+1):#高度切割
res = max(res, dfs(i, y) + dfs(x - i, y))
for i in range(1, y//2+1):#宽度切割
res = max(res, dfs(x, i) + dfs(x, y - i))
return res
d = {(h, w):p for h, w, p in prices} #木头块高宽和价格映射表
return dfs(m, n)
如果不使用 @functools.lru_cache(None) 测试将会超时。
cache
简介
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) 获得相同的效果。
使用场景
functools 模块应用于高阶函数,即参数或(和)返回值为其他函数的函数(e.g.,dfs(深度优先搜索))。 通常来说,此模块的功能适用于所有可调用对象。
官方示例
from functools import cache
# 在一个递归函数上应用 cache 装饰器
@cache
def factorial(n):
return n * factorial(n-1) if n else 1
>>> factorial(10) # 没有以前缓存的结果,进行11次递归调用
3628800
>>> factorial(5) # 只是查找缓存值结果
120
>>> factorial(12) # 进行两个新的递归调用,其他10个被缓存
479001600

浙公网安备 33010602011771号