我必须多次计算一个函数。 要计算此函数,必须计算数组的元素。 阵列非常大。
如何避免在每个函数调用中分配数组。
我尝试过的代码 就像这样:
class FunctionCalculator(object):
def __init__(self, data):
"""
Get the data and do some small handling of it
Let's say that we do
self.data = data
"""
def function(self, point):
return numpy.sum(numpy.array([somecomputations(item) for item in self.data]))
好吧,也许我的担心是没有根据的,所以我首先提出这个问题。
问题:对于[somecomputations(item) for item in data]
的每次调用,是否正在分配和取消分配数组function
?
认为我已经尝试过这种情况
class FunctionCalculator(object):
def __init__(self, data):
"""
Get the data and do some small handling of it
Let's say that we do
self.data = data
"""
self.number_of_data = range(0, len(data))
self.my_array = numpy.zeros(len(data))
def function(self, point):
for i in self.number_of_data:
self.my_array[i] = somecomputations(self.data[i])
return numpy.sum(self.my_array)
这比以前的版本慢。我假设第一个版本中的列表理解可以完全在C中运行,而在第二个版本中,脚本的较小部分可以转换为优化的C代码。
我对Python的工作原理一无所知。
问题:有没有一种好方法可以在每个函数调用中跳过数组分配,同时利用数组上优化良好的循环?
我正在使用Python3.5
答案 0 :(得分:1)
循环数组是不必要的,并且多次访问python到c,因此减慢了速度。 numpy数组的优点在于逐个单元地对它们起作用。我认为最快的将是:
return numpy.sum(somecomputations(self.data))
某些计算可能需要一些修改,但通常它会起作用。此外,您还没有使用积分和其他内容。