基本的に私が必要とするのは、これの最終結果です:
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配列を返すより効率的な方法はありますか? または、関数内でインスタンス変数を変更することを受け入れる必要がありますか? (実際の関数は、2 つの完全に異なるクラスの 2 つのインスタンスを取り、3 つ目のインスタンスを変更します。したがって、メソッドではなく関数です。また、追加された値は、関数内で評価されるベクトルです。)