gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:41:14 24 4
gpt4 key购买 nike

我遇到这样一种情况,我需要从稀疏矩阵中提取单行并将其点积与密集行相乘。使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com