NumPy 1.0 发布十八年后,我们非常高兴地宣布 NumPy 2.0 正式发布!这个重大版本标志着 NumPy 发展的一个重要里程碑,它为用户带来了大量的增强和改进,并为未来的功能开发奠定了基础。

NumPy 在过去的 18 年里得到了改进和发展,许多旧版本带来了重大的性能、可用性和一致性改进。也就是说,我们的方法很长一段时间以来一直是只进行增量更改,同时仔细管理向后兼容性。这种方法最大限度地减少了用户中断,但也限制了可以进行改进的范围,包括 API 及其底层实现。因此,对于这个一次性的主要版本,我们打破了向后兼容性,以在 NumPy 的类型系统中实现重大改进。类型系统是 NumPy 的基础,而重大的行为更改如果不混合使用两个不同的类型系统,则无法以增量方式进行,这将是灾难的根源。

通往实际 2.0 版本的旅程漫长而艰难,难以积累必要的势头。部分原因可能是,有一段时间,NumPy 开发人员将 NumPy 2.0 版本与对代码库中重要关键部分进行彻底的革命性重写等同起来。这些重写和更改中的许多在过去几年里都发生了,但由于向后兼容性问题,它们在很大程度上对用户来说是不可见的。NumPy 2.0 是这些努力的结晶,它使我们能够丢弃一些阻碍未来改进的旧版 ABI(应用程序二进制接口)。

至少从 2019 年开始,NumPy 内部的一些重大更改(2.0 中关键功能所必需)一直在进行中。我们在一年前的 2023 年 4 月,在一个长达四小时的 公开计划会议 上开始制定 2.0 版本的具体计划。许多关键更改都得到了提出和讨论。我们当时确定的一些关键目标在范围上可能甚至比我们中的一些人预期的还要大、还要雄心勃勃。这也激发了一些额外的能量——这真是太好了。在会议之后以及过去的一年中,针对每个重大更改,都编写、审查和实施了 NumPy 增强提案 (NEP)。

一些关键亮点包括:

  • 清理和简化 Python API (NEP 52):Python API 经过彻底清理,使 NumPy 更易于学习和使用。主要命名空间减少了大约 10%,而更利基的 numpy.lib 命名空间减少了大约 80%,从而在公共和私有 API 元素之间提供了更清晰的区分。

  • 改进的标量提升规则:标量提升规则已更新,如 NEP 50 中所提议的那样,解决了类型提升中令人惊讶的行为,例如零维数组。

  • 强大的新 DType API 和新的字符串 dtype:NumPy 2.0 引入了一个新的 API,用于实现用户定义的自定义数据类型,如 NEP 41 中所提议的那样。我们使用这个新 API 来实现 StringDType,为可变长度字符串提供了高效且轻松的支持,如 NEP 55 中所提议的那样。我们希望这能够在 PyData 生态系统和 NumPy 本身中启用未来具有有趣新功能的新数据类型。

  • Windows 兼容性增强:Windows 上的默认 32 位整数表示形式已更新为 64 位架构上的 64 位,解决了 NumPy 在操作系统之间可移植工作时最常见的问题之一。

  • 支持 Python 数组 API 标准:这是第一个包含对数组 API 标准 (v2022.12) 的完全支持的版本,这得益于上述新的提升规则、API 和 API 清理。我们还根据 NEP 56 中的提议,使现有 API 和行为与标准保持一致。

这些只是一些对行为和可用性影响更大的更改。此外,NumPy 2.0 包含重大的性能和文档改进,以及更多内容——有关更改的完整列表,请参阅 NumPy 2 发行说明

为了采用这个主要版本,用户可能需要调整现有的代码,但我们努力在改进和确保向 NumPy 2.0 的过渡尽可能无缝之间取得平衡。我们编写了一个全面的 迁移指南 和一个 ruff 插件,可帮助更新 Python 代码,使其能够同时与 NumPy 1.x 和 NumPy 2.x 一起使用。

虽然我们确实要求 C API 用户重新编译其项目以支持 NumPy 2.0,但我们在 NumPy 1.25 中已经为此做好了准备。构建过程得到了简化,因此您现在可以使用最新的 NumPy 版本进行编译,并保持向后兼容性。这意味着使用 NumPy 2.x 构建的项目可以“神奇地”与 1.x 兼容。这也意味着项目不再需要使用最旧的支持的 NumPy 版本来构建其二进制文件。

在整个开发过程中,我们都知道推出 NumPy 2.0 将会(暂时)造成破坏,因为存在向后不兼容的 API 和 ABI 更改。我们投入了大量精力来沟通这些更改,帮助下游项目进行适配,跟踪流行开源项目的兼容性(例如,参见 numpy#26191),并以有限的速度完成发布流程,为采用提供时间。毫无疑问,接下来的几周将暴露出一些新的挑战,但是我们完全预期这些挑战是可以管理的,并且从长远来看是值得的。

NumPy 2.0 版本是多年来由众多开发者组成的协作、主要由志愿者参与的努力的结果。此外,上述许多更改如果没有资助者和机构赞助商的支持,是不可能实现的,他们允许多名团队成员将其日常工作的一部分用于 NumPy 的开发。我们特别感谢:戈登和贝蒂·摩尔基金会、阿尔弗雷德·P·斯隆基金会、美国宇航局、英伟达、Quansight Labs、陈·扎克伯格倡议和 Tidelift。

我们对 NumPy 的未来改进感到兴奋,其中许多改进将得益于 NumPy 2.0 中的更改。请参阅 NumPy 路线图,了解一些正在开发或在愿望清单上的功能。让我们继续共同努力,改进 NumPy 以及科学 Python 和 PyData 生态系统!