Python中lru_cache的使用和实现详解

在计算机软件领域,缓存(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

猜你喜欢

转载自blog.csdn.net/buduoduoorg/article/details/113134541