概述

我们都知道,提升项目性能的一大利器就是利用缓存在减少重复的计算过程。
而在 Python 语言中,内置了一些机制可以帮助我们更加容易的实现 Python 缓存的使用。

lru_cache

在 Python 的 functools 包中提供了一个 lru_cache 的函数。它可以帮助我们轻松的将一个普通函数转化为一个支持 cache 的高性能函数。
具体来说:

  1. @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 装饰器的使用:

  1. @lru_cache(maxsize=None)
  2. def fib(n):
  3. if n < 2:
  4. return n
  5. return fib(n-1) + fib(n-2)
  6. [fib(n) for n in range(16)]
  7. # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
  8. fib.cache_info()
  9. # CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)
  10. fib.cache_clear()