Python 高效的numpy数组初始化以避免副作用?

Python 高效的numpy数组初始化以避免副作用?,python,numpy,Python,Numpy,基本上,我需要的是这个的最终结果: import numpy as np class A: def __init__(self, dim): self.b = np.zeros(dim) def add_to_a(a, value): a.b += value dim = 10000 value1 = np.random.rand(dim) a = A(dim) %%timeit add_to_a(a, value1) 100000 loops,

基本上,我需要的是这个的最终结果:

import numpy as np

class A:
    def __init__(self, dim):
        self.b = np.zeros(dim)

def add_to_a(a, value):
    a.b += value

dim = 10000
value1 = np.random.rand(dim)    
a = A(dim)

%%timeit add_to_a(a, value1)
100000 loops, best of 3: 9.64 us per loop
然而,我更喜欢在函数外部更改一个函数,主要是为了清晰起见,但也因为我知道好的编程风格可以避免函数产生副作用。所以,我可以这样做:

def dont_add(dim, value):
    c = np.zeros(dim)
    c += value
    return c

%%timeit a.b += dont_add(dim, value1)
10000 loops, best of 3: 25.8 us per loop
显然,性能的降低是非常显著的(我将把它作为一个大循环的一部分来运行)。我假设这是因为函数中的numpy数组初始化,所以我尝试了以下方法:

d = np.empty(dim)
def dont_add2(d, value):
    d.fill(0)
    d+=value
    return d

%%timeit a.b += dont_add2(d, value1)
10000 loops, best of 3: 26.3 us per loop
更糟


有没有更有效的方法让函数返回numpy数组?或者我应该接受在函数中更改实例变量吗?(实际函数接受两个完全不同的类的两个实例,并修改第三个实例;因此是函数而不是方法。此外,附加值是函数中计算的向量。)

减速不是因为初始化,而是因为将零写入整个数组。如果您只想将值存储在数组中,只需使用
d.fill(value)
,而不必经过两个步骤。在实际函数中,所有值都不相同。您的意思是值也可以是数组?是的,对不起,现在修改问题。重要的是要指出,
don\u add2
仍然有副作用。。。