python 优化记忆搜索 cache与lru_cache

记忆化搜索

记忆化搜索(Memoization Search)是一种动态规划的优化技术,其目的是避免重复计算已经计算过的子问题,提高算法效率。

在记忆化搜索中,程序会记录下已经计算过的结果,然后在后续的计算中,如果需要再次计算相同的问题,就直接返回之前保存的结果,而不是重新计算。这样就能够避免重复计算,提高程序的执行效率。

记忆化搜索通常是通过递归实现的,对于每个需要计算的子问题,先检查是否已经计算过,如果是则直接返回结果,如果不是则计算并保存结果。通过这种方式,整个算法可以将问题分解成多个子问题,并且只计算一次每个子问题的结果,大大降低了计算复杂度,提高了算法效率。

记忆化搜索常用于求解具有重叠子问题性质的问题,例如最短路径、背包问题等

功能介绍

在其他语言中,记忆化往往需要用户自定义数组记录实现

而python中提供了现成的装饰器。包括@lru_cache@cache 两种,均属于functools库。

lru_cache

LRU(Least Recently Used),当缓存队列已满时,将缓存使用次数最少的元素从队列中移除,将新元素加入队列。

@functools.lru_cache(maxsize=128, typed=False)
其中maxsize为最大缓存数量,默认为128。None则无限制。typed=True时不同参数类型的调用将分别缓存,默认False。

cache

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

案例

# 在一个递归函数上应用 cache 装饰器
def factorial(n):
    return sum(factorial(i) for i in range(n))

@cache
def factorial2(n):
    return sum(factorial2(i) for i in range(n))

@lru_cache(None)
def factorial3(n):
    return sum(factorial3(i) for i in range(n))

t1 = time.perf_counter()
factorial(22)
t2 = time.perf_counter()
factorial2(22)
t3 = time.perf_counter()
factorial3(22)
t4 = time.perf_counter()
print('不使用cache用时:', t2-t1)
print('使用cache用时:', t3-t2)
print('lru_cache:', t4-t3)
'''
不使用cache用时: 1.0714207999999998
使用cache用时: 2.8600000000045256e-05
lru_cache: 1.9100000000049633e-05
'''
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值