本文介绍了Scipy稀疏矩阵乘法比Numy数组慢得多的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我构造了以下用例来测试一维稀疏矩阵乘法与数值数组。
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微秒)慢。
尝试不同类型的稀疏矩阵,包括CSR/COO,结果是相同的。为什么稀疏矩阵乘法比稀疏密集数组乘法慢~30倍?是否因为矩阵太稀疏?
推荐答案
使用随机稀疏矩阵计算向量,默认稀疏度为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微秒。
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)
现在稀疏具有显著的速度优势。
计算方法千差万别,很难找出造成时间差的原因。
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?
这篇关于Scipy稀疏矩阵乘法比Numy数组慢得多的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!