Scipy sparse matrix multiplication much slower than numpy array(Scipy稀疏矩阵乘法比Numy数组慢得多)
本文介绍了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数组慢得多的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:Scipy稀疏矩阵乘法比Numy数组慢得多
基础教程推荐
猜你喜欢
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01