NumPy 2.0.0 现已发布,这是自 2006 年以来的第一个主要版本,是自上一个功能版本发布以来经过 11 个月开发的成果。该版本包含了来自 212 位贡献者提交的 1078 个 PR,引入了大量的新功能以及对 Python 和 C API 的更改。
此主要版本包括常规次要(功能)版本中不会发生的破坏性变更 - 包括 ABI break、type promotion rules 的更改,以及在 1.26.x 中可能未发出弃用警告的 API 更改。
Highlights
新功能:
- 一个新的可变长度字符串 dtype,StringDType 以及新的 numpy.strings 命名空间,包含用于字符串操作的高性能 ufunc
- 在所有 numpy.fft 函数中支持 float32 和 longdouble
- 在主 numpy 命名空间中支持数组 API 标准。
性能改进:
- 通过使用 Intel x86-simd-sort 和 Google Highway 库,排序函数(sort、argsort、partition、argpartition)已得到加速,并且可能会看到较大的(特定于硬件的)加速
- 为 MacOS >=14 提供 macOS 加速支持和 binary wheels,显著提高了 MacOS 上线性代数运算的性能,并将 wheels 缩小了约 3 倍
- numpy.char fixed-length string operations 已通过实现 ufuncs 加速,ufuncs 除了支持 fixed-length string dtypes 外,还支持 StringDType
- 一种新的 tracing 和 introspection API,opt_func_info,用于确定哪些特定于硬件的内核可用并将被调度
- numpy.save 现在使用 pickle 协议版本 4 来保存具有对象 dtype 的数组,这允许 pickle 对象大于 4GB,并将大型数组的保存速度提高约 5%。
Python API 改进:
- 公共和私有 API 之间有明确的划分,采用新的模块结构,并且每个 public function 现在都可以在一个地方使用,
- 删除了许多不推荐的函数和别名。这将使学习和使用 NumPy 变得更容易。主命名空间中的对象数量减少了约 10%,numpy.lib 中的对象数量减少了约 80%
- 规范的 dtype 名称和新的 isdtype 自省函数
C API 改进:
- 用于创建自定义 dtypes 的新公共 C API
- 删除了许多过时的函数和宏,并隐藏了私有内部函数以方便将来的扩展
- 新的、更易于使用的初始化函数: PyArray_ImportNumPyAPI 和 PyUFunc_ImportUFuncAPI
改进的行为:
- 通过采用 NEP 50,改进了 type promotion 行为。有关详细信息,可参阅 NEP 和 NumPy 2.0 迁移指南。因为此更改可能会导致输出 dtypes 发生变化,并降低混合 dtype 操作的精度结果。
- Windows 上的默认整数类型现在是 int64 而不是 int32,与其他平台上的行为相匹配
- 数组的最大维数从 32 更改为 64
文档:
- 参考指南导航得到了显着改进,现在有关于 NumPy module structure 的文档
- 从源文档构建的内容被完全重写
此外,NumPy 内部结构也发生了很多变化,包括继续将代码从 C 迁移到 C++,以使得将来改进和维护 NumPy 变得更加容易。
值得一提的是,所有的改进都是有代价的。具体代价是:
- 向后兼容性。Python 和 C API 都有很多破坏性更改。在大多数情况下,都会有明确的错误消息告知用户如何调整其代码。但是,也存在一些行为变化,无法给出这样的错误消息 - 具体可参照弃用和兼容性部分以及 NumPy 2.0 迁移指南中的介绍。注意,有一种 ruff 模式可以自动修复 Python 代码中的许多问题。
- 对 NumPy ABI 的破坏性更改。因此,使用 NumPy C API 并根据 NumPy 1.xx 版本构建的软件包二进制文件将无法在 NumPy 2.0 中运行。导入时,此类软件包将出现 ImportError,并显示二进制不兼容的信息。针对NumPy 2.0构建的二进制文件可以在运行时同时适用于NumPy 2.0和1.x。有关更多详细信息,可参阅 NumPy 2.0-specific advice。
官方建议所有依赖 NumPy ABI 的下游包针对 NumPy 2.0 构建新版本,并验证该版本是否适用于 2.0 和 1.26 - 最好是在 2.0.0rc1(将是 ABI-stable)和最终的 2.0.0 版本之间的,以避免给用户带来问题。
此版本支持的 Python 版本为 3.9-3.12。
更多详情可查看发布说明。