Python学习笔记--内置模块functools中的lru_cache()函数

在编写一些应用中,我们的一些函数常常需要做一些耗时较长的操作,比如调用第三方API,进行复杂的运算等。尤其是处理数据的一些应用,需要重复计算,或者从外部获取数据,可以使用内置模块functools中的lru_cache()函数把计算的数据缓存下来,在后面重复计算使用数据时,就不再计算而是从缓存中获取前面计算过的数据,从而提升效率。

lru_cache()是一个装饰器,它可以用于将一个函数的结果缓存起来,以便在将来的调用中重复使用这些结果,从而提高性能。它使用最近最少使用(LRU)策略来管理缓存的大小。

使用场景:

  1. 重复计算:当某个函数的结果需要重复计算时,可以使用lru_cache()来缓存结果。这样,在后续的调用中,可以直接从缓存中获取结果,而不需要重新计算。
  2. 缓存数据:当某个函数需要从外部资源(如数据库、网络等)获取数据时,可以使用lru_cache()来缓存这些数据。这样,在后续的调用中,可以直接从缓存中获取数据,而不需要重新从外部资源获取。
  3. 优化性能:对于一些计算密集型或IO密集型的函数,使用lru_cache()可以显著提高性能。因为重复计算和外部资源访问通常是耗时的操作,使用缓存可以避免不必要的计算和访问。
from functools import lru_cache  
  
@lru_cache(maxsize=None)  
def factorial(n):  
    if n < 0:  
        return None  
    elif n == 0:  
        return 1  
    else:  
        return n * factorial(n-1)

在上面这个示例中,定义了一个阶乘函数factorial(),并使用lru_cache()装饰器将其缓存起来。通过设置maxsize=None,设置为缓存无限大。然后,可以多次调用factorial()函数,比如:

>>>factorial(2)

>>>factorial(8)

>>>factorial(22)

因为使用lru_cache(maxsize=None)装饰器对factorial函数进行修饰,每次对该函数进行调用时,其结果都会被缓存起来。举例来说,执行factorial(10), factorial(20), factorial(30)等调用,其结果都会被分别缓存。之后,如果再次调用factorial(10), factorial(20), factorial(30),系统会直接从缓存中获取结果,而不会重新进行计算。这样可以显著提高函数的性能,特别是对于那些需要重复计算或从外部资源获取数据的函数。

另外,lru_cache()装饰器不会导致系统崩溃,即使缓存不足也不会受到影响。当缓存已满时,最近最少使用的缓存项将被自动删除,以便为新的缓存项腾出空间。在这种情况下,下次调用该函数时将重新计算其结果,并将其添加到缓存中。因此,使用lru_cache()装饰器可以有效地管理和优化缓存,而不会导致系统崩溃。

你可能感兴趣的:(学习,笔记,python)