python - 为什么 scipy 的稀疏 csr_matrix 向量点积比 numpy 的密集数组慢?

标签 python numpy scipy sparse-matrix

我遇到这样一种情况,我需要从稀疏矩阵中提取单行并将其点积与密集行相乘。使用 scipy 的 csr_matrix,这似乎比使用 numpy 的密集数组乘法慢得多。这让我感到惊讶,因为我预计稀疏点积将涉及更少的操作。这是一个例子:

import timeit as ti

sparse_setup = 'import numpy as np; import scipy.sparse as si;' + \
               'u = si.eye(10000).tocsr()[10];' + \
               'v = np.random.randint(100, size=10000)'

dense_setup  = 'import numpy as np; u = np.eye(10000)[10];' + \
               'v = np.random.randint(100, size=10000)'

ti.timeit('u.dot(v)', setup=sparse_setup, number=100000)
2.788649031019304

ti.timeit('u.dot(v)', setup=dense_setup, number=100000)
2.179030169005273

对于矩阵向量乘法,稀疏表示毫无疑问地胜出,但在这种情况下并非如此。我尝试使用 csc_matrix,但性能更差:

>>> sparse_setup = 'import numpy as np; import scipy.sparse as si;' + \
...                'u = si.eye(10000).tocsc()[10];' + \
...                'v = np.random.randint(100, size=10000)'
>>> ti.timeit('u.dot(v)', setup=sparse_setup, number=100000)
7.0045155879925005

为什么在这种情况下 numpy 打败了 scipy.sparse?对于这类计算,是否有更快的矩阵格式?

最佳答案

CSR/CSC 向量乘积调用每次调用有几微秒的开销,从执行一小段 Python 代码到处理编译代码中的参数 (scipy.sparse._sparsetools.csr_matvec)。

在现代处理器上,计算矢量点积非常快,因此在这种情况下,开销主导了计算时间。矩阵向量乘积本身更昂贵,并且在这里看不到类似的开销。

为什么 Numpy 的开销更小?这主要是由于更好地优化了代码; csr_matrix 的性能可能会在这里得到改善。

关于python - 为什么 scipy 的稀疏 csr_matrix 向量点积比 numpy 的密集数组慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817189/

相关文章:

python - 使用 scipy.integrate 积分向量场(一个 numpy 数组)

python - 使用自定义 pdf 时 stats.rv_continuous 变慢

python - 如何对一堆字符串的元素进行分组

java - Jython PyList 映射到 List<String> 以及其他 Jython 到 Java 变量映射

python - C :\Python27\python. exe: 无法打开文件 '/cygdrive/c/Python27/Scripts/Program' : [Errno 2] 没有这样的文件或目录

python - 用于谐波分析的快速傅里叶变换

python - 值错误 : No axis named 1 for object type <class 'pandas.core.series.Series' >

python - 从列表中选择唯一值

python - 如何使用 FFT 查找方波的频率

python - 绘制向量函数的最 Pythonic 方法