详解Python 记忆化和缓存

  • Post category:Python

当Python程序需要频繁执行某个计算密集型函数时,我们可能会发现该程序的运行速度会比较慢。一种优化的方法是使用记忆化和缓存,通过缓存已经计算好的结果,减少程序的计算量,从而提高程序的运行效率。

记忆化

记忆化是一种优化技术,通过保存函数的输入和输出,来避免重复计算。在Python中可以使用装饰器的方式实现记忆化机制。下面是一个简单的例子:

def memoize(func):
    cache = {}
    def wrapper(*args):
        if args in cache:
            return cache[args]
        else:
            result = func(*args)
            cache[args] = result
            return result
    return wrapper

@memoize
def fibonacci(n):
    if n in (0, 1):
        return n
    return fibonacci(n-1) + fibonacci(n-2)

在上面的示例中,我们定义了一个memoize装饰器,它会将函数的输入和输出保存起来,在下一次调用该函数时,会先检查缓存中是否已经存在该输入对应的输出,如果存在,则直接返回已经计算好的输出,否则再执行计算。在fibonacci函数中,我们使用了这个装饰器,将该函数的计算结果缓存起来。

缓存

缓存是一种常见的优化技术,它可以将计算结果存储在内存或者磁盘中,以便下一次需要时快速读取。在Python中,我们可以使用functools模块中的lru_cache函数来实现缓存。下面是一个示例:

import time
from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    if n in (0, 1):
        return n
    return fibonacci(n-1) + fibonacci(n-2)

start_time = time.time()
print(fibonacci(35))
end_time = time.time()
print("Time taken: ", end_time - start_time, "seconds")

在上面的示例中,我们使用lru_cache来实现fibonacci函数的缓存,maxsize参数指定了缓存的最大大小。在第一次调用时,fibonacci函数需要递归计算35次,但在之后的调用中,由于结果已经被缓存,只需要读取缓存中的结果即可。这样可以大大提高程序的执行效率。