Python多次避免大型数组分配

时间:2016-10-22 15:13:45

标签: python-3.x

我必须多次计算一个函数。 要计算此函数,必须计算数组的元素。 阵列非常大。

如何避免在每个函数调用中分配数组。

我尝试过的代码 就像这样:

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

1 个答案:

答案 0 :(得分:1)

循环数组是不必要的,并且多次访问python到c,因此减慢了速度。 numpy数组的优点在于逐个单元地对它们起作用。我认为最快的将是:

return numpy.sum(somecomputations(self.data))

某些计算可能需要一些修改,但通常它会起作用。此外,您还没有使用积分和其他内容。