基本上我需要的是最终结果:
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
但是,我更喜欢在函数外部更改 a ,主要是为了清晰起见,还因为我已经理解良好的编程风格避免了函数导致副作用。所以,我可以这样做:
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数组?或者我应该接受在函数中更改我的实例变量? (实际函数接受两个完全不同的类的两个实例并修改第三个类;因此是函数而不是方法。此外,添加的值是在函数内计算的向量。)