跳到内容

路线图

有关此路线图的小册子版本,请参见 此链接

背景

PyData/Sparse 的目标是创建实现 ndarray 接口的稀疏容器。传统上,在 PyData 生态系统中,稀疏数组由 scipy.sparse 子模块提供。那里的所有容器都依赖并模拟 numpy.matrix 接口。这意味着它们仅限于二维,并且在 numpy.ndarray 可以工作的地方表现不佳。

PyData/Sparse 正在顺利取代 scipy.sparse,成为 PyData 生态系统中事实上的稀疏数组实现。

主题

  • 更多存储格式
  • 更好的性能/算法
  • 覆盖更多NumPy API
  • SciPy 集成
  • Dask 集成以实现高可扩展性
  • CuPy 集成以实现GPU加速
  • 维护和通用改进

更多存储格式

在稀疏领域,在内存中表示数组时必须选择一种格式,不同的格式有不同的权衡。例如

  • 外部库通常期望 CSR/CSC 格式,并且它们对于大多数数组具有良好的空间特性
  • DOK 允许就地修改和写入
  • 如果按顺序写入,LIL 具有更快的写入速度。
  • BSR 允许块写入和读取

当然,最重要的格式是 CSR 和 CSC,因为它们允许与包括 MKL、LAPACK 等在内的许多库进行零拷贝交互。这将使 PyData/Sparse 能够迅速达到 scipy.sparse 的功能,加速其被取代的进程。

更好的性能/算法

scipy.sparse 中有少数地方的算法不够优化,有时是由于依赖于 NumPy 而 NumPy 不具备这些算法。我们打算改进 NumPy 中的算法,让更广泛的社区有机会使用它们;同时也在 PyData/Sparse 中,以便在最广泛的使用场景中达到最佳效率。

覆盖更多NumPy API

我们的最终目标是覆盖 NumPy 中所有存在能够使稀疏数组优于密集数组的算法的领域。目前,PyData/Sparse 支持归约、逐元素函数以及其他常用函数,例如堆叠、连接和张量积。稀疏数组的常见用途包括线性代数和图论子程序,因此我们计划首先覆盖这些内容。

SciPy 集成

PyData/Sparse 旨在构建容器及其上的基本操作,例如逐元素操作、归约等。我们计划修改 scipy.sparse.csgraph 中当前的图论子程序以支持 PyData/Sparse 数组。线性代数和 scipy.sparse.linalg 亦然。

CuPy 集成以实现GPU加速

CuPy 是一个在 GPU 上实现 NumPy ndarray 接口大部分功能的项目。我们计划与 CuPy 集成,以便在 GPU 上加速稀疏数组。

已完成任务

Dask 集成以实现高可扩展性

Dask 是一个项目,它采用 ndarray 风格的容器,然后允许它们跨多个核心或集群进行扩展。我们计划与 Dask 团队进行更紧密的集成与合作,以确保 Dask 的最大功能与稀疏数组兼容。

目前,与 Dask 的集成通过数组协议得到支持。当更多 NumPy API(例如数组创建函数)通过数组协议可用时,Dask 将自动支持它们。

(部分)SciPy 集成

scipy.sparse.linalg 的支持已完成。我们希望未来能增加对 scipy.sparse.csgraph 的支持。

更多存储格式

GCXS,一种基于 Shaikh and Hasan 2015 提出的 GCRS/GCCS 格式的压缩 N 维数组格式,已添加。结合这项工作,CSR/CSC 矩阵格式现已成为 pydata/sparse 的一部分。我们计划为目前支持的许多操作添加性能更好的算法。