同事们,免责声明。有一个问题,从实现的角度来看,我想出了一个抽象且完全愚蠢的例子。这个例子只是为了说明我的问题,并不是一个好的解决方案的例子。
这是一个例子:
import random
random.seed(123)
def test_random(len):
return [random.randint(0, 10) ** 2 for _ in range(len)]
print ([test_random(10)[i] for i in range(3)])
有一个函数可以生成并返回某个集合,可以通过索引/键来访问该集合的元素。列表、字典、元组 - 没关系,在示例中,为了便于说明,我使用了列表。给定相同的输入数据,该函数返回相同的结果。我们使用列表/字典包含,尝试根据此函数返回的集合生成一些其他集合。问题很明显 - 通过这种实现,我们每次迭代列表包含时都请求该函数,而不是一次获取对象并访问它。
问题。
是否可以在不多次调用函数并且不首先引入一个临时变量(我将在其中返回函数结果)的情况下实现这样的逻辑?
作为一种选择,您可以将
for一个元素的列表中的另一个循环插入到列表包含中。尽管缓存可能更好。更好的是,首先将值存储在变量中,然后使用它。一般来说,列表包含不适用于复杂的事情。如果您无法编写没有包含内容的代码,那么这很正常,您不需要将所有内容都简化为它们。最好明确地说:
如果函数在给定相同输入的情况下返回相同结果,则可以使用缓存,这样每次调用函数时就不会不断地重新计算结果。
带装饰器的选项
@cache结论:
这里的缺点是,如果这是库内的函数,那么用户可能不知道缓存的存在并尝试添加自己的优化。那些。内部实施不明显。
需要明确的是,您可以使用相同的装饰器手动添加函数的缓存变体,只需将其用作函数:
如果需要清除缓存的能力,则需要使用装饰器,那么可以使用该装饰器添加到函数中的
@lru_cache方法来清除缓存:cache_clear()lambda允许您将计算结果存储在参数中,然后多次使用::=将值存储在元组的开头,在元组的末尾使用。从技术上讲,与预先引入临时变量没有什么不同: