Python: 允许函数跨调用访问信息的最佳结构是什么
Python: What is the best structure that allows functions to access information across calls
我目前正在编写一个代理功能,旨在在竞争中竞争,并且每轮都会被调用以执行一系列动作。我想在回合之间保存一些数据(函数调用)。
我的问题是什么是存储此数据的最佳方式,以便我的函数可以在调用之间访问它,而不必在每次调用时都重新计算它。我正在考虑制作一个全局 class 对象来存储我需要的所有内容,但怀疑可能还有其他方法。
举个例子,假设我想在该函数中存储一个需要花费一些时间计算的长列表,我可以在哪里 put/store 该列表,以便下一次我可以再次访问它调用函数的时间,无需重新计算。
您似乎走对了路。为什么不创建一个对象 class,创建它的实例来存储不同的 'save data',看看效果如何?
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)
如果我理解正确的话,有两个简单的解决方案。您可以使用闭包——一个内部函数——这样您就可以对数据进行预处理,return 一个可以在其范围内访问它的函数。
这里有一个相当愚蠢的累加和示例,您可以在创建闭包时对其进行初始化:
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 的对象可以像函数一样被调用:
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 对象来存储我需要的所有内容,但怀疑可能还有其他方法。
举个例子,假设我想在该函数中存储一个需要花费一些时间计算的长列表,我可以在哪里 put/store 该列表,以便下一次我可以再次访问它调用函数的时间,无需重新计算。
您似乎走对了路。为什么不创建一个对象 class,创建它的实例来存储不同的 'save data',看看效果如何?
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)
如果我理解正确的话,有两个简单的解决方案。您可以使用闭包——一个内部函数——这样您就可以对数据进行预处理,return 一个可以在其范围内访问它的函数。
这里有一个相当愚蠢的累加和示例,您可以在创建闭包时对其进行初始化:
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 的对象可以像函数一样被调用:
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
仍然是一个可以拥有属性和额外方法的对象,所以你可以用它做比普通闭包更多的事情(即使这个例子没有利用它)。