Python标准库提供了一个名为functools
的模块,其中包含一个有用的装饰器——lru_cache
,可以用于缓存计算结果,从而提高函数的执行效率。下面是lru_cache
的使用方法攻略。
1. 基本使用
要使用lru_cache
装饰器,需要先将其导入:
from functools import lru_cache
然后,将其应用于需要被缓存的函数上:
@lru_cache()
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
在上述代码中,我们使用lru_cache
装饰器,将一个支持递归的斐波那契数列计算函数进行了装饰。lru_cache
内部会记录函数的参数和返回值,如果下一次使用同样的参数调用该函数,则直接返回缓存中的结果。
2. 配置选项
lru_cache
还支持一些可选的配置,如:
maxsize
控制缓存的容量大小。默认值是128。可以通过指定该参数修改容量大小,例如:
@lru_cache(maxsize=None)
def expensive_function(n):
...
上述代码中,我们将缓存的最大容量设为无限大。该参数也可以设为其他数值,如:
@lru_cache(maxsize=64)
def expensive_function(n):
...
typed
控制是否将不同类型的参数分别缓存。默认值是False。如果将其设为True,则不同类型的参数将分别缓存。例如:
@lru_cache(typed=True)
def expensive_function(n, f):
...
上述代码中,我们将函数的两个参数分别缓存。
3. 示例说明
下面,我们通过两个示例说明lru_cache
的使用方法。
示例1:斐波那契数列
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
for i in range(10):
print(fib(i))
上述代码中,我们定义了一个支持递归的斐波那契数列计算函数,并使用lru_cache
进行了装饰。在循环中,我们打印了从0到9的斐波那契数列的值。在函数被缓存的情况下,计算斐波那契数列的效率显著提高。
示例2:字符串反转
from functools import lru_cache
@lru_cache(maxsize=None)
def reverse_string(s):
if len(s) <= 1:
return s
return s[-1] + reverse_string(s[:-1])
print(reverse_string("hello world"))
上述代码中,我们定义了一个递归函数,用于反转字符串。函数内部使用了切片和递归操作,可以对任意长度的字符串进行反转操作。使用lru_cache
装饰器对该函数进行装饰后,反转过程的效率显著提高。最终,我们在函数内部使用了递归法反转了”hello world”这个字符串。