首页 > 解决方案 > 理解 Python 中的记忆

问题描述

我想更好地理解 Python 中的记忆。在我正在参加的在线课程中,提供了以下示例:

def memoize(func):
    memo_dict = {}
    def wrapper(*args):
        if args not in memo_dict:
            memo_dict[args] = func(*args)
        return memo_dict[args]
    return wrapper

@memoize
def find_divisors_memo(n):
    divisors = []
    for i in range(1, n+1):
        if n % i == 0:
            divisors.append(i)
    return divisors

memo_dict我试图在运行几个示例后找到存储的数值,例如:

find_divisors_memo(100000009)
find_divisors_memo(100000008)

我愿意:

for x,y in memo_dict.items():      
        print(x,y)

它说:NameError: name 'memo_dict' is not defined

标签: python

解决方案


如果您想查看 dict 以了解 memoization,您可以添加一些print语句:

def memoize(func):
    memo_dict = {}
    def wrapper(*args):
        if args not in memo_dict:
            memo_dict[args] = func(*args)
        else:
            print('using cached value')
        print(memo_dict.items())
        return memo_dict[args]
    return wrapper

@memoize
def find_divisors_memo(n):
    print('function called')
    divisors = []
    for i in range(1, n+1):
        if n % i == 0:
            divisors.append(i)
    return divisors

现在您可以在每个函数调用中看到 dict 的项目。
此外,您将看到记忆化的工作原理:如果您第一次使用特定参数调用函数,则实际上调用了该函数。如果您使用相同的参数再次调用它,它实际上并不会调用该函数(这可能是一个计算量非常大的函数),而是使用 dict 中的缓存值。

如果你想在实际项目中使用缓存,我推荐functools.lru_cache. 此外,在名为cachetools.


推荐阅读