SciPy Roadmap#
此路线图页面仅包含 SciPy 未来发展中最重要的想法和需求。有关更详细的路线图,包括每个子包的状态、更多想法、API 稳定性等,请参阅 详细 SciPy 路线图。
对分布式数组和 GPU 数组的支持#
NumPy 使用 __array_function__ 和 __array_ufunc__ 将其 API 与其执行引擎分离。这将使 SciPy 的一部分能够接受分布式数组(例如 dask.array.Array)和 GPU 数组(例如 cupy.ndarray),这些数组实现了 ndarray 接口。目前尚不清楚哪些算法可以直接使用,以及在使用时是否会有显著的性能提升。我们希望创建一个地图,显示 SciPy API 的哪些部分有效,并随着时间的推移改进支持。
除了利用 NumPy 协议(如 __array_function__)之外,我们也可以在 SciPy 中利用这些协议。这将使得能够(重新)实现 SciPy 函数,例如 scipy.signal 中的函数,用于 Dask 或 GPU 数组(参见 NEP 18 - NumPy 之外的使用)。NumPy 在这些领域的功能仍在不断发展,请参见例如 NEP 37 - 类似于 NumPy 的模块的分发协议,SciPy 是这些功能的重要的“客户端”。
性能改进#
速度提升、降低内存使用量以及并行化算法的能力对大多数科学领域和用例都有益。我们已经为多进程建立了一个 API 设计模式 - 使用 workers 关键字 - 它可以被更多函数采用。
让用户更容易在依赖 SciPy 功能的代码中使用 Numba 的 @njit 将释放很多性能提升。但这需要一个策略,例如基于 Transonic 或自定义代码,支持多种即时编译和提前编译编译器(如在 gh-23447 中探索的)。
最后,许多单个函数可以针对性能进行优化。scipy.optimize 和 scipy.interpolate 函数在这方面尤其受到关注。
支持更多硬件平台#
SciPy 现在对 ARM64(或 aarch64)和 POWER8/9(或 ppc64le)具有持续集成,并且可以通过 Miniforge 提供二进制文件。PyPI 上这些平台的 wheel 现在也成为可能(使用 manylinux2014 标准),并且对这些平台的请求也越来越多。
此外,使用 TravisCI 现在可以实现 IBM Z(或 s390x)的 CI,但尚未完成 - 并且在那种情况下也可以使用 manylinux2014 wheel。最后,解决开放的 AIX 构建问题将帮助用户。
除了稀疏矩阵之外,实现稀疏数组#
SciPy 稀疏矩阵正在被稀疏数组取代。稀疏矩阵格式基本完成,但它们的主要问题在于它们像 numpy.matrix 一样(NumPy 最终会弃用它)。我们想要的是像 numpy.ndarray 一样的稀疏数组(参见 gh-18915 中的讨论)。稀疏数组从 1.15 版本开始支持稀疏矩阵的所有功能。除了 2D 数组之外,1D 稀疏数组也支持 DOK、COO、CSR 格式。正在开发进一步的功能,例如 nD 数组支持和某些操作的广播。
- 将稀疏数组 API 扩展到 nD 数组
COO、CSR 和 DOK 格式。COO 格式已经部分到位。
nD 格式使用 2D CSR 代码来执行 nD 操作,例如索引/最小值-最大值/算术运算。
稀疏数组二进制运算将在某些设置中支持广播。广播对于稀疏数组来说很棘手,因为它严重依赖于密集数组的跨步内存模型,因此并不总是适合稀疏数据格式。我们的乐观目标是支持所有有意义的稀疏数据结构的广播。我们从像 A + B 这样的二进制运算开始。
帮助其他库从稀疏矩阵转换为稀疏数组。创建过渡指南和有用的脚本来标记需要更改的代码。
弃用然后删除“稀疏矩阵”,而赞成“稀疏数组”。
与 NumPy 合作弃用/删除
numpy.matrix。