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

Leo*_*nid 7 python memory performance numpy

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

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

或者

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

更新:替换np.emptynp.zeros

Leo*_*nid 1

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

这将导致对计算的中间结果进行几次新的分配:

self.temp = a * b + c
Run Code Online (Sandbox Code Playgroud)

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

numpy.multiply(a, b, out=self.x)
numpy.add(c, self.x, out=self.temp)
Run Code Online (Sandbox Code Playgroud)

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