在计算机软件领域,缓存(Cache)指的是将部分数据存储在内存中,以便下次能够更快地访问这些数据,这也是一个典型的用空间换时间的例子。一般用于缓存的内存空间是固定的,当有更多的数据需要缓存的时候,需要将已缓存的部分数据清除后再将新的缓存数据放进去。需要清除哪些数据,就涉及到了缓存置换的策略,LRU(Least Recently Used,最近最少使用)是很常见的一个,也是 Python 中提供的缓存置换策略。
下面我们通过一个简单的示例来看 Python 中的 lru_cache 是如何使用的。
1
2
3
4
5
6
7

8
def factorial(n):
print(f"计算 {n} 的阶乘")
return 1 if n <= 1 else n * factorial(n - 1)
a = factorial(5)
print(f'5! = {a}')
b = factorial(3)
print(f'3! = {b}')
上面的代码中定义了函数 factorial,通过递归的方式计算 n 的阶乘,并且在函数调用的时候打印出 n 的值。然后分别计算 5 和 3 的阶乘,并打印结果。运行上面的代码,输出如下
计算 5 的阶乘
计算 4 的阶乘
计算 3 的阶乘
计算 2 的阶乘
计算 1 的阶乘
5! = 120
计算 3 的阶乘
计算 2 的阶乘
计算 1 的阶乘
3! = 6
可以看到, factorial(3) 的结果在计算 factorial(5) 的时候已经被计算过了,但是后面又被重复计算了。为了避免这种重复计算,我们可以在定义函数 factorial 的时候加上 lru_cache 装饰器,如下所示
1
2
3
4
5
6
import functools
# 注意 lru_cache 后的一对括号,证明这是带参数的装饰器
@functools.lru_cache()
def factorial(n):
print(f"计算 {n} 的阶乘")
return 1 if n <= 1 else n * factorial(n - 1)
重新运行代码,输入如下
计算 5 的阶乘
计算 4 的阶乘
计算 3 的阶乘
计算 2 的阶乘
计算 1 的阶乘
5! = 120
3! = 6
可以看到,这次在调用 factorial