2017-09-08 8 views
0

Ich habe den folgenden Fall erstellt, um eindimensionale Sparse-Matrix-Multiplikation vs numpy Arrays zu testen.Scipy dünn Matrix-Multiplikation viel langsamer als numpy Array

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) 

Das Ergebnis ist wie folgt:

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) 

Auch sie sind sowohl langsamer als eine Ebene dict Einträge speichert und eine for-Schleife für die Multiplikation (~ 1 us).

Das Ergebnis ist das gleiche, nachdem verschiedene Arten von spärlichen Matrix, einschließlich CSR/COO versucht. Warum ist die Multiplikation mit spärlicher Matrix ~ 30 mal langsamer als die Multiplikation mit dichten Arrays? Liegt es daran, dass die Matrix zu spärlich ist?

+0

Es ist eine noch schnellere Lösung: 'sp.data.dot (sp.data)', '3.3ns pro loop' –

+0

@NilsWerner ich wahrscheinlich brauchen Um das Beispiel ein wenig zu ändern, muss ich die Multiplikation auf verschiedene Matrizen anwenden. In diesem Fall gibt Ihre Lösung eine falsche Antwort. –

+0

Ich nehme an, dass es nicht viel zu gewinnen gibt, wenn ein spärlicher Vektor verwendet wird. Die Situation ändert sich wirklich, wenn Sie dünn besetzte Matrizen verwenden (nxm, n, m> 1). – Hannebambel

Antwort

0

Ihr 'Vektor' berechnet mit einer zufälligen spärlichen Matrix, mit der Standardspärlichkeit 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) 

So spärlich ist 10x langsamer. (A*A).sum() mal wie 130 μs.

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

Aber eine quadratische Matrix zu machen (mit 5-fach von Null verschiedenen Begriffen):

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) 

Jetzt spärlich hat einen erheblichen Geschwindigkeitsvorteil.

Die Berechnungsmethoden sind so unterschiedlich, dass es schwierig ist, jemanden zu identifizieren, der die Zeitunterschiede berücksichtigt.

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?

Verwandte Themen