1、为什么需要缓存?
在编写程序时,经常会遇到需要计算某个函数的输出,然后在稍后的代码中多次使用该输出的情况。
如果每次需要计算时都重新运行函数,将浪费大量的计算时间。
缓存可以将函数的输出存储在内存中,以便以后可以直接获取,而无需重新计算。
这可以显著提高程序的性能,特别是在处理计算密集型任务时。
2. functools.lru_cache 简介
functools.lru_cache装饰器是Python标准库中的一种缓存工具
3. lru_cache的基本用法
使用functools.lru_cache非常简单。只需在要缓存的函数上添加装饰器即可
from functools import lru_cache
@lru_cache()
def function(arg):
# 计算复杂的结果
return result
这将自动为function函数添加缓存功能,以避免重复计算相同输入值的结果。
缓存大小限制
设置缓存的大小限制,以控制缓存的大小。
例如,要将缓存大小限制为1000个条目:
@lru_cache(maxsize=1000)
def function(arg):
# 计算复杂的结果
return result
当缓存达到最大大小时,最不常使用的结果将被清除以腾出空间。
expensive_function.cache_clear()
4. 高级用法和选项
typed 参数
默认情况下,lru_cache会将不同类型的参数视为相同的参数。如果希望根据参数的类型进行缓存,可以使用typed=True:
@lru_cache(typed=True)
def function_with_typed_cache(arg):
# 根据参数类型进行缓存
return result
5. 示例:使用lru_cache优化斐波那契数列计算
一个实际示例,演示如何使用lru_cache来优化斐波那契数列的计算:
from functools import lru_cache
import time
spend=int(time.time())
@lru_cache(maxsize=None) # 不限制缓存大小
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
result = fibonacci(40) # 非常快速
print(result)
print((time.time()-spend)*1000)
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
result = fibonacci(40)
print(result)
print((time.time()-spend)*1000)
结果:
102334155
4.015207290649414
102334155
56764.39905166626
6. 适用场景
何时使用lru_cache
当有昂贵的函数计算,并且希望避免重复计算时。
当需要快速访问最近使用的函数结果。
何时不使用lru_cache
当函数的结果占用大量内存,导致内存不足时。
当函数的参数具有大量可能的取值,缓存命中率很低。