概述
我们都知道,提升项目性能的一大利器就是利用缓存在减少重复的计算过程。
而在 Python 语言中,内置了一些机制可以帮助我们更加容易的实现 Python 缓存的使用。
lru_cache
在 Python 的 functools 包中提供了一个 lru_cache 的函数。它可以帮助我们轻松的将一个普通函数转化为一个支持 cache 的高性能函数。
具体来说:
@functools.lru_cache(maxsize=128, typed=False)
它是一个为函数提供缓存功能的装饰器,缓存 maxsize 组传入参数,在下次以相同参数调用时直接返回上一次的结果,从而可以节约高开销或I/O函数的调用时间。
PS:
- 由于使用了字典存储缓存,所以该函数的固定参数和关键字参数必须是可哈希的。
- 如果 maxsize 设为 None,LRU 特性将被禁用且缓存可无限增长,默认 maxsize 为 128。
- 如果 typed 设置为 true,不同类型的函数参数将被分别缓存。例如, f(3) 和 f(3.0) 将被视为不同而分别缓存。
我们以通过动态规划计算斐波那契数列的例子为例,来演示一下 lru_cache 装饰器的使用:
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
[fib(n) for n in range(16)]
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
fib.cache_info()
# CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)
fib.cache_clear()