2017-09-08 26 views
0

私は1次元スパース行列乗法対numpy配列をテストするために以下のケースを構築しました。次のようにScipyスパース行列乗算がnumpy配列よりもはるかに遅い

from scipy.sparse import csc_matrix 
sp = csc_matrix((1, 36710)) 
sp[0,4162] = 0.2335 
sp[0,21274] = 0.1367 
sp[0,27322] = 0.261 
sp[0,27451] = 0.9266 

%timeit sp.dot(sp.T) 
arr = sp.toarray()[0] 
%timeit arr.dot(arr) 

結果は:

267 µs ± 6.58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
9.9 µs ± 230 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 

はまた、彼らは両方のエントリを格納する普通のdictよりも遅いとしているため、ループ乗算(〜1μsの)のために。

結果は、csr/cooを含む異なる種類の疎行列を試した後も同じです。なぜ、疎な行列の乗算が、numpyの密な配列の乗算よりも30倍遅いのですか?マトリックスはあまりにも希薄ですか?

+0

さらに速く解決策があります: 'sp.data.dot(sp.data)'、 'loop' –

+0

@NilsWernerあたり3.3nsが、私はおそらく必要がこの例を少し変更するには、異なる行列に乗法を適用する必要があります。その場合、解が間違った答えを返す –

+0

疎ベクトルを使用することで得られる余裕があまりないと思います。スパース行列(nxm、n、m> 1)を使用すると、状況が実際に変わります。 – Hannebambel

答えて

0

デフォルトの希薄度0.01を使用して、ランダムな疎行列の「ベクトル」計算を行います。

In [523]: M = sparse.random(1,50000,format='csr') 
In [524]: timeit M*M.T 
479 µs ± 289 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
In [525]: A = M.A 
In [526]: timeit np.dot(A,A.T) 
40.1 µs ± 21.4 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

スパースは10倍遅くなります。 120μsとして(A*A).sum()回。

In [531]: M 
Out[531]: 
<1x50000 sparse matrix of type '<class 'numpy.float64'>' 
    with 500 stored elements in Compressed Sparse Row format> 

しかし、(5×非ゼロ項を持つ)正方行列を作る:

In [537]: M = sparse.random(500,500,format='csr') 
In [538]: M 
Out[538]: 
<500x500 sparse matrix of type '<class 'numpy.float64'>' 
    with 2500 stored elements in Compressed Sparse Row format> 
In [539]: A=M.A 
In [540]: timeit M*M 
416 µs ± 4.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
In [541]: timeit [email protected] 
13.4 ms ± 81.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

今スパースは、実質的な速度の利点を有しています。

計算方法が大きく異なるため、時間差を考慮したものを特定するのが難しいです。

Is sparse matrix-vector multiplication faster in Matlab than in Python?

Directly use Intel mkl library on Scipy sparse matrix to calculate A dot A.T with less memory

Why is vector dot product slower with scipy's sparse csr_matrix than numpy's dense array?

関連する問題