【问题标题】:dense matrix vs sparse matrix in pythonpython中的密集矩阵与稀疏矩阵
【发布时间】:2021-02-23 08:05:46
【问题描述】:

我在 python 中比较矩阵行的读取时间,首先采用密集格式,然后采用稀疏格式。

从密集矩阵中“提取”一行大约需要 3.6e-05 秒

对于稀疏格式,我尝试了 csr_mtrix 和 lil_matrix,但对于行读取都花费了大约 1-e04 秒

我希望稀疏格式能够提供最佳性能,谁能帮助我理解这一点?

【问题讨论】:

  • 一行的“提取”是什么意思? 究竟你在做什么?另外,为什么您希望稀疏矩阵在 speed 方面提供最佳性能?稀疏矩阵针对其内存利用率进行了优化。速度/内存是一种常见的权衡
  • 对于提取,我的意思是 row = M[i,:],或者 row = M.getrow(i),如果它是稀疏的。我希望它会更好,至少直观,因为在稀疏格式中,我不需要实际读取所有行,而只需要读取非零值。也许我必须指定它是我拥有的一个稀疏矩阵,所以有很多零
  • 密集数组是内存连续的。一些稀疏数组也是如此(即csr)。 lil 数组不是,一行中的每个值都需要不同的随机访问。这显然会导致大多数访问和数学运算的性能异常差。

标签: python performance matrix sparse-matrix


【解决方案1】:

arr[i,:] 用于密集数组会产生view,因此其执行时间与arr.shape 无关。如果您不了解view 和copy 之间的区别,则需要更多阅读numpy 基础知识。

csr 和lil 格式允许索引看起来很像ndarray's,但有关键的区别。在大多数情况下,view 的概念并不适用。有一个例外。 M.getrowview(i) 利用lil 的独特数据结构来生成view。 (阅读其文档和代码)

csr 格式的某些索引实际上使用矩阵乘法,使用特殊构造的“提取器”矩阵。

在稀疏索引产生稀疏矩阵的所有情况下,实际上从数据构造新矩阵需要时间。 Sparse 不像numpy 那样使用编译代码。相对于numpy,它的强项是 10% 稀疏(或更小)的矩阵的矩阵乘法。

在最简单的格式(易于理解)coo 中,每个非零元素由 3 个值表示 - 数据、行、列。这些存储在 3 个 1d 数组中。因此,它必须具有小于 30% 的稀疏性才能在内存使用方面达到收支平衡。 coo 没有实现索引。

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 2014-03-06
    • 2013-05-06
    • 1970-01-01
    • 2015-04-26
    • 2021-01-31
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多