Python lru_cache保存计算结果

  • Post category:Python

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”这个字符串。