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

pod7payv  于 2023-05-21  发布在  Python
关注(0)|答案(2)|浏览(137)

我有一个类和它的方法。该方法在执行期间重复多次。此方法使用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

更新:将np.empty替换为np.zeros

hyrbngr7

hyrbngr71#

Numpy数组一旦创建就很快。然而,创建一个数组是相当昂贵的。比创建一个Python列表要多得多。
在像你这样的情况下,你一次又一次地创建一个新数组(在for循环中?),我总是预先分配数组结构,然后重用它。
我不能评论Python是否足够聪明来优化它,但我猜它不是:)
你的数组有多大,调用这个方法的频率有多高?

ffx8fchx

ffx8fchx2#

是的,您需要预分配大型数组。但这是否有效取决于你如何使用这些数组。
这将导致计算的中间结果的几个新分配:

self.temp = a * b + c

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

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

但是对于这些情况(当你在不平凡的公式中使用大型数组时),最好使用numexpreinsum进行矩阵计算。

相关问题