python - 理解 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
。
解决方案
如果您想查看 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
.
推荐阅读
- python - 在 python 中使用 .tiff 图像进行深度学习
- java - 文件存在时Java NoSuchFileException
- python - 通过 REST API 共享一个维护其架构的 pandas DataFrame
- kotlin - 在 Kotlin 中使用 RoundingMode HALF_UP 不添加整数时舍入错误
- amazon-web-services - 放大联合登录:验证异常
- python - 如何在 Python 脚本中解决 DeepPavlov、Tensorflow 和 Numpy 之间的不兼容问题
- jwt - 如何将自定义 JWT 令牌身份验证添加到 .NET Framework SignalR 服务器?
- java - Jackson 为保存的引用生成 id
- python-3.x - 有没有办法将条件(if/for)语句转换为变量?
- python - python获取假期时间的时间范围