Python:允许函数跨调用访问信息的最佳结构是什么



我目前正在编写一个代理函数,该函数旨在竞争,每次都会被调用来执行一系列动作。我想在两次循环(函数调用(之间保存一些数据。

我的问题是,存储这些数据的最佳方式是什么,这样我的函数就可以在调用之间访问它,而不必每次调用都重新计算它。我正在考虑创建一个全局类对象来存储我需要的一切,但我怀疑可能还有其他方法。

举个例子,假设我想在函数中存储一个花了一点时间计算的长列表,我可以将该列表放在哪里/存储,以便下次调用函数时可以再次访问它,而不必重新计算

如果我正确理解这个问题,有两个简单的解决方案。您可以使用闭包——一个内部函数——这样您就可以对数据进行预处理,并返回一个在其范围内可以访问数据的函数。

这里,有一个相当愚蠢的累积和的例子,你可以在创建闭包时初始化:

def make_acc_sum(init_elements):
# initial preprocessing
s = sum(init_elements)
# function that knows the preprocessed data
def acc_sum(new_val):
nonlocal s
s += new_val
return s
return acc_sum

ac = make_acc_sum([1, 2, 3])
for i in range(5):
print(ac(i))

在许多应用程序中,当您不想对封闭范围内的数据做太多处理时,这是一种很好的技术。如果您只想在调用函数时访问它,它可以满足您的需求。

如果你想要你的";函数";为了支持对预处理数据进行更通用的操作,可以将其转换为对象。实现__call__的类中的对象可以像函数一样被调用:

class acc_sum:
def __init__(self, init_elements):
# initial preprocessing
self.s = sum(init_elements)
def __call__(self, new_val):
# function that knows the preprocessed data
self.s += new_val
return self.s

ac = acc_sum([1, 2, 3])
for i in range(5):
print(ac(i))

但是这个版本的ac仍然是一个可以具有属性和其他方法的对象,所以使用它可以比使用普通闭包做更多的事情(尽管示例没有利用这一点(。

你似乎走上了正轨。为什么不创建一个对象类,创建它的实例来存储不同的"保存数据",看看它的进展如何?

class saveFile:
def __init__(self, data):
self.data = data
def main():
data = something.compute() #whatever that took a bit of time to compute...
#create an instance of a saveFile class object
file_1 = saveFile(data)
#to recall the data in the form of file_1.data
print(file_1.data)

最新更新