1

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

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 数组?还是我应该接受在函数中更改我的实例变量?(实际的函数采用两个完全不同的类的两个实例并修改第三个;因此是一个函数而不是一个方法。此外,添加的值是在函数内评估的向量。)

4

0 回答 0