【问题标题】:Scipy sparse matrix multiplication much slower than numpy arrayScipy稀疏矩阵乘法比numpy数组慢得多
【发布时间】:2018-02-17 02:53:21
【问题描述】:

我构建了以下案例来测试一维稀疏矩阵乘法与 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 循环 (~1µs) 慢。

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

【问题讨论】:

  • 还有一个更快的解决方案:sp.data.dot(sp.data), 3.3ns per loop
  • @NilsWerner 我可能需要稍微更改示例,但我需要将乘法应用于不同的矩阵,在这种情况下,您的解决方案会给出错误的答案
  • 我想使用稀疏向量没有什么好处。如果您使用稀疏矩阵 (nxm, n,m>1),情况就会真正改变。
  • 尝试稀疏度为 1% 和 10% 的矩阵。这种情况可能过于稀疏,因为稀疏矩阵设置主导了实际计算。

标签: numpy scipy sparse-matrix


【解决方案1】:

在 hpaulj 的回答中,M*M 不是矩阵乘法——它只是一个元素乘法。这就是为什么 M*M 比矩阵乘法快得多的原因。所以在所有情况下,对于 csr 矩阵,矩阵乘法都要慢得多。

【讨论】:

  • M = sparse.random(250,500,format='csr') & M * M 给出ValueError: dimension mismatch* 对于 numpy 数组是元素级的,对于稀疏数组是点积
【解决方案2】:

您的“向量”计算具有随机稀疏矩阵,默认稀疏度为 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)

所以 sparse 慢了 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>

但是制作一个方阵(包含 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 A@A
13.4 ms ± 81.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

现在 sparse 具有相当大的速度优势。

计算方法如此不同,以至于很难确定任何导致时间差异的因素。

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?

【讨论】:

    猜你喜欢
    • 2017-07-21
    • 2021-03-05
    • 1970-01-01
    • 2015-07-19
    • 2017-07-20
    • 2012-11-24
    • 2015-03-27
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多