簡體   English   中英

為什么 scipy 的稀疏 csr_matrix 向量點積比 numpy 的密集數組慢?

[英]Why is vector dot product slower with scipy's sparse csr_matrix than numpy's dense array?

我有一種情況,我需要從稀疏矩陣中提取一行,並將其點積與密集行相乘。 使用 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 的性能可能會在這里得到改善。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM