gpt4 book ai didi

Python缓存创建的列表

转载 作者:行者123 更新时间:2023-11-28 21:34:35 28 4
gpt4 key购买 nike

我必须编写一个获取三个参数的函数。较低,较高的缓存。较低和较高给出了创建新列表的范围。这部分是这段代码:

def one_range(lower, higher, cache):
list1 = []
for i in range(lower,higher):
list1.append(i)
return list1

如果使用相同的参数调用“range”两次,则两次都应返回相同的列表。第二次不是再次生成列表,而是重复使用。我该怎么做?

编辑了原始函数

最佳答案

假设 cache 是一个字典,您可以从其他参数创建一个 tuple 并查看该元组是否在字典中。如果是,则从字典中返回值,否则计算值并将其存储在字典中,然后再返回。您还可以为 cache 提供一个默认值,这样即使没有它也可以使用该函数。

def one_range(lower, higher, cache=None):
if cache is not None and (lower, higher) in cache:
return cache[(lower, higher)]
lst = []
for i in range(lower,higher):
lst.append(i)
if cache is not None:
cache[(lower, higher)] = lst
return lst

例子:

c = {}
x = one_range(2, 4, c)
y = one_range(1, 4, c)
z = one_range(2, 4, c)
print(x is z) # True
print(c) # {(2, 4): [2, 3], (1, 4): [1, 2, 3]}

虽然有很多样板代码,但会使函数困惑。实际上,使用函数装饰器可以更容易地做到这一点。如果你不能使用functools.lru_cache,你可以在几行代码中实现你自己的内存装饰器:

def memo(f):
f.cache = {}
def _f(*args, **kwargs):
if args not in f.cache:
f.cache[args] = f(*args, **kwargs)
return f.cache[args]
return _f

然后在您的函数中使用它,不再需要 cache 参数:

@memo
def one_range(lower, higher):
lst = []
for i in range(lower,higher):
lst.append(i)
return lst

关于Python缓存创建的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53156538/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com