【问题标题】:Why sparse matrix computing on python is too slow为什么python上的稀疏矩阵计算太慢
【发布时间】:2017-02-28 13:03:21
【问题描述】:

我使用的格式是csr稀疏矩阵,推荐加点和点运算符最快的稀疏结构。我将它的性能与 np.array 的加法和点运算符进行了比较。但是,稀疏矩阵的计算比密集格式下的情况慢得多,这似乎很奇怪。为什么?有没有更高效的方法来实现稀疏计算?

import numpy as np
import scipy.sparse as sp
import random

#%% generate dense vector
vector_length = 10000
nonzero_term = 200

x = np.zeros((vector_length, ))
y = np.zeros((vector_length, ))

index = random.sample(range(vector_length), nonzero_term)
x[index] = np.random.rand(nonzero_term)
index = random.sample(range(vector_length), nonzero_term)
y[index] = np.random.rand(nonzero_term)

#%% transform to sparse vector
x_sp = sp.csr_matrix(x)
y_sp = sp.csr_matrix(y)

#%% test

# dense add
%timeit [x + y]
# sparse add
%timeit [x_sp + y_sp]     
# dense dot
%timeit [x.dot(y)]
# sparse dot
%timeit [x_sp.dot(y_sp.T)] 

结果显示

100000 loops, best of 3: 6.06 µs per loop
10000 loops, best of 3: 97.8 µs per loop
100000 loops, best of 3: 3.45 µs per loop
1000 loops, best of 3: 225 µs per loop

【问题讨论】:

    标签: python performance numpy scipy sparse-matrix


    【解决方案1】:

    两组操作都使用编译后的代码。但是数据的存储方式完全不同。

    x.shape 是 (10000,); y 同样。 x+y 只需分配一个相同形状的数组,并在c 中高效地遍历 3 个数据缓冲区。

    x_sp 有 200 个非零值,这些值在 x_sp.data 中,它们的列索引在 x_sp.indices 中。还有第三个数组,x_sp.indptr,但只有 2 个值。 y_sp 也是如此。但是要添加它们,它必须遍历 4 个数组,并将值分配给两个数组。即使使用c 编码,也有很多工作要做。在我的测试用例中,x_sp+y_sp 有 397 个非零值。

    对于这些一维数组(1 行矩阵),dot 涉及相同类型的遍历值,只是将它们全部相加为一个最终值。

    如果矩阵的密度足够低,稀疏计算可以更快。我认为,矩阵乘法比加法更是如此。

    总之,稀疏矩阵的每个元素计算更加复杂。所以即使元素很少,总的时间也会变长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 2023-04-10
      • 2018-06-04
      • 1970-01-01
      • 2018-01-19
      • 2023-02-04
      相关资源
      最近更新 更多