我应该预先分配一个numpy数组吗?

时间:2015-10-25 18:55:41

标签: python performance numpy memory

我有一个班级和它的方法。该方法在执行期间重复多次。此方法使用numpy数组作为临时缓冲区。我不需要在方法调用之间将值存储在缓冲区内。我应该创建数组的成员实例,以避免在方法执行期间内存分配上的时间泄漏吗?我知道,最好使用局部变量。但是,Python是否足够聪明,只能为阵列分配一次内存?

class MyClass:
    def __init__(self, n):
        self.temp = numpy.zeros(n)
    def method(self):
        # do some stuff using self.temp

或者

class MyClass:
    def __init__(self, n):
        self.n = n
    def method(self):
        temp = numpy.zeros(self.n)
        # do some stuff using temp

更新:用零替换为空

2 个答案:

答案 0 :(得分:1)

Numpy数组一旦创建就很快。但是,创建一个数组非常昂贵。比创建一个python列表更重要。

在像你这样的情况下,你一次又一次地创建一个新数组(在for循环中?),我总是预先分配数组结构,然后重用它。

我不能评论Python是否足够聪明以优化它,但我猜它不是:)

您的数组有多大以及调用此方法的频率如何?

答案 1 :(得分:1)

是的,您需要预先分配大型数组。但是,如果这将是有效的取决于你如何使用这些数组。

这将为计算的中间结果带来几个新的分配:

self.temp = a * b + c

这不会(如果预先分配self.x):

numpy.multiply(a, b, out=self.x)
numpy.add(c, self.x, out=self.temp)

但是对于这些情况(当您使用大型数组处理重要公式时)最好使用numexpreinsum进行矩阵计算。