Lru_cache(来自 functools)如何工作

python

1个回答

写回答

Flora幼稚鬼

2025-06-25 06:40

+ 关注

Python
Python

Lru_cache是Python中functools库中的一个装饰器,它提供了一种缓存函数结果的方法,以便在后续调用中可以快速获取结果。Lru_cache使用Least Recently Used(最近最少使用)算法来决定哪些结果应该被缓存,哪些应该被删除。本文将详细介绍Lru_cache的工作原理,并提供一个案例代码来说明其使用方法。

Lru_cache的工作原理如下:当一个函数被装饰为Lru_cache时,它的结果将会被缓存下来。当下次再次调用该函数时,如果传入的参数与之前的调用相同,则直接返回缓存中的结果,而不会再次执行函数体内的代码。这样可以避免重复计算相同参数的结果,从而提高函数的执行效率。

案例代码:

Python

from functools import lru_cache

@lru_cache(maxsize=3)

def fibonacci(n):

if n < 2:</p> return n

else:

return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(5))

print(fibonacci(4))

print(fibonacci(3))

print(fibonacci(2))

print(fibonacci(1))

print(fibonacci(0))

上述代码定义了一个斐波那契数列的函数fibonacci,使用了Lru_cache装饰器。该函数接受一个参数n,返回斐波那契数列的第n项。在函数体内,如果n小于2,则直接返回n;否则,通过递归调用函数计算第n-1项和第n-2项的和。这个递归调用会导致重复计算相同的项,但通过Lru_cache的缓存机制,可以避免重复计算,提高计算效率。

在案例代码中,我们先调用了fibonacci(5),结果为5。然后依次调用了fibonacci(4)、fibonacci(3)、fibonacci(2)、fibonacci(1)和fibonacci(0),分别返回了3、2、1、1和0。注意到,在计算fibonacci(4)时,需要计算fibonacci(3)和fibonacci(2)的结果,而计算fibonacci(3)时又需要计算fibonacci(2)的结果。但由于Lru_cache的缓存机制,fibonacci(2)的结果只计算了一次,并被缓存下来,后续调用时直接从缓存中获取结果,避免了重复计算。

工作原理解析:

Lru_cache的工作原理可以分为以下几个步骤:

1. 创建一个缓存空间,用于存储函数调用的结果。默认情况下,maxsize为128,表示最多缓存128个不同的函数调用结果。

2. 当函数被调用时,Lru_cache会检查传入的参数是否已经在缓存中。如果存在缓存结果,则直接返回该结果,函数体内的代码不会执行。

3. 如果参数不在缓存中,Lru_cache会执行函数体内的代码,并将结果存入缓存。同时,如果缓存已满,Lru_cache会使用Least Recently Used算法删除最久未使用的结果,为新的结果腾出空间。

4. 下次再次调用函数时,如果传入的参数与之前的调用相同,则直接返回缓存中的结果,避免重复计算。

缓存大小控制:

Lru_cache提供了maxsize参数来控制缓存的大小。maxsize表示最多缓存多少个不同的函数调用结果。当缓存达到最大容量时,新的结果会替换掉最久未使用的结果。如果maxsize设置为None,则表示缓存大小无限制,所有的结果都会被缓存。

在案例代码中,我们设置了maxsize为3。当计算fibonacci(4)时,由于缓存中只有fibonacci(0)、fibonacci(1)和fibonacci(2)的结果,需要计算fibonacci(3)和fibonacci(2)。但由于缓存大小限制为3,最久未使用的fibonacci(0)会被删除,为新的结果腾出空间。这样,后续再次调用fibonacci(0)时,需要重新计算。

:

Lru_cache是Python中functools库提供的一个强大的装饰器,可以在函数调用过程中缓存结果,避免重复计算。它使用Least Recently Used算法来决定哪些结果应该被缓存,哪些应该被删除。通过合理设置缓存大小,可以在一定程度上提高函数的执行效率。在实际应用中,Lru_cache可以用于那些计算量较大的函数,避免重复计算相同参数的结果,提高程序的性能。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号