Scipy稀疏矩阵乘法比numpy数组慢

时间:2017-09-08 08:32:03

标签: numpy scipy sparse-matrix

我构造了以下案例来测试一维稀疏矩阵乘法与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和乘法的for-loop慢(~1μs)。

尝试不同类型的稀疏矩阵后,结果相同,包括csr / coo。为什么稀疏矩阵乘法比numpy密集乘法慢30倍?是因为矩阵太稀疏了吗?

2 个答案:

答案 0 :(得分:1)

在hpaulj的答案中,M * M不是矩阵乘法-而是逐元素乘法。这就是为什么M * M比矩阵乘法快得多的原因。因此,在所有情况下,对于csr矩阵,矩阵乘法都慢得多。

答案 1 :(得分: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倍。 (A*A).sum()次为130μs。

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

但是制作一个方阵(5x非零项):

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 A@A
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?