4

こんにちは、numpy + numba を使用して科学計算を実行しています。numpy 配列のインプレース追加が非常に遅いことに気付きました... matlab と比較して

ここにmatlabコードがあります:

tic;
% A,B are 2-d matrices, ind may not be distinct
for ii=1:N 
    A(ind(ii),:) =  A(ind(ii),:) +  B(ii,:);
end
toc;

ここにnumpyコードがあります:

s = time.time()
# A,B are numpy.ndarray, ind may not be distinct
for k in xrange(N):
     A[ind[k],:] += B[k,:];
print time.time() - s

結果は、numpy コードが matlab よりも 10 倍遅いことを示しています...これは私を大いに混乱させます。

さらに、for ループから足し算を引き出し、1 つの行列の足し算を numpy.add と比較すると、numpy と matlab の速度は同等のようです。

私が知っている 1 つの要因は、matlab が version>=2012a の JIT を使用して for ループを高速化することですが、python コードで numba を試してみましたが、それでも少しも高速化されません。これは numba が numpy.add 関数にまったく触れていないことが関係していると思います。そのため、パフォーマンスはまったく変わりません。

この場合、matlabはいくつかの病気のキャッシュを行うと推測しているため、numpyを劇的に打ち負かします。

numpy を高速化する方法に関する提案はありますか?

4

2 に答える 2

0

ドット マトリックス乗算を使用するバージョンを次に示します。から 1 と 0 の行列を作成しますind

def bar(A,B,ind):
    K,M =B.shape
    N,M =A.shape
    I = np.zeros((N,K))
    I[ind,np.arange(K)] = 1
    return A+np.dot(I,B)

このようなサイズの問題でK,M,N = 30,14,15は、約 3 倍高速です。しかし、それK,M,N = 300,100,150は少し遅いような大きなものの場合。

于 2013-10-16T20:29:07.843 に答える