NumPy 1.26.2 维护版变更解析:回归修复、构建系统改进与 Cython 兼容性
【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy
NumPy 1.26.2 是 1.26.x 系列中的一次维护版本发布,重点修复 1.26.1 发布后发现的缺陷与回归问题,同时覆盖构建系统、CI 基础设施和文档元数据的完善。本文以 1.26.2-changelog.rst 为主体,结合当前仓库源码逐项解读本次合并的 25 个 Pull Request,帮助开发者在升级、源码构建与 Cython 扩展开发中准确评估该版本的影响。
一、版本定位与支持范围
NumPy 1.26.2 属于维护版本(maintenance release),与 1.26.1 相比不含新功能特性,全部工作集中在缺陷修复、构建稳定性与工程基础设施优化。其最值得关注的历史定位是:1.26 系列是 NumPy 2.0 之前规划的最后一个次版本系列,因此本版本中所有修复都承担着为 2.0 平稳过渡铺路的职责。
本版本支持的 Python 版本为3.9 至 3.12。这一支持范围与正式发布说明一致,具体可参考 1.26.2-notes.rst。
从贡献数据看,本次发布共有13 位贡献者参与,其中 5 位(@thalassemia、Charles Bousseau、Marcel Bargull、Mark Mentovai、William Ayd)为首次向 NumPy 提交补丁的贡献者;本次共合并25 个 Pull Request。
二、25 个合并 PR 的分类全景
将 25 个 PR 按前缀标签归类,可清晰看出本版本的改动重心:修复类(BUG)4 个、构建类(BLD)7 个、CI 类 2 个、维护类(MAINT)6 个、文档类(DOC)2 个、功能增强(ENH)1 个、发布类(REL)1 个,另有测试对齐与基础设施调整若干。
| 分类 | PR 编号 | 主题 |
|---|---|---|
| ENH | #24955 | 为NPY_FR_GENERIC添加 Cython 枚举 |
| REL | #24962 | 从 release 分支移除 Python 版本上限 |
| BLD | #24971 | 运行 tempita.py 时使用正确的 Python 解释器 |
| MAINT | #24972 | 移除import_array()中无帮助的错误替换 |
| BLD | #24977 | macOS 使用经典链接器(规避 Xcode 15 新链接器问题) |
| BLD | #25003 | musllinux_aarch64 wheel 构建 |
| BLD | #25083 | 修复 ppc64 基线设为 Power9 时的构建问题 |
| BLD | #25093 | 修复 Meson 构建下features.h检测 |
| BUG | #25095 | 规避 Cython 3 中 intp 转换回归 |
| CI | #25107 | 移除过时 job,迁移 macOS 与 conda Azure job |
| CI | #25108 | 引入 linux_qemu action,移除 Travis 测试 |
| MAINT | #25112 | 同步更新 .spin/cmds.py |
| DOC | #25113 | 在 wheel 中视觉区分主许可证与捆绑许可证 |
| MAINT | #25115 | 为 shuffle helpers 补充缺失的noexcept |
| DOC | #25116 | 修正 OpenBLAS 许可证标识符 |
| BLD | #25117 | 改进 Netlib libblas/libcblas/liblapack 检测 |
| MAINT | #25118 | 将位域整数改为无符号 |
| BUG | #25119 | 将np.random.multinomial的 n 改为长整型 |
| BLD | #25120 | 将allow-noblas选项默认值改为 true |
| BUG | #25121 | 确保np.dtype传入自身不会崩溃 |
| MAINT | #24814 | 对齐 test_dispatcher 的 s390x 目标与_umath_tests_mtargets |
三、核心缺陷修复的源码级解析
本版本最重要的价值集中在 4 个 BUG 修复上,它们分别涉及随机数生成、dtype 边界行为与 Cython 3 兼容性。以下结合当前仓库源码逐项说明。
3.1 np.random.multinomial 的 n 参数改为长整型(#25119)
经典随机模块mtrand中multinomial的签名在修复后为:
def multinomial(self, long n, object pvals, size=None):对应实现位于 numpy/random/mtrand.pyx。此前n以较窄的整型处理,在传入较大实验次数时存在溢出或截断风险;本次修复将其声明为 C 层long,保证大样本场景下计数结果的正确性。同时,新式随机接口Generator.multinomial位于 numpy/random/_generator.pyx,其类型标注在 numpy/random/_generator.pyi 中可查。使用该接口时,n与pvals的校验逻辑不变,但底层整型宽度已与平台 long 对齐。
3.2 np.dtype 传入自身不再崩溃(#25121)
此前np.dtype(some_dtype_instance)这类"将 dtype 对象传回 dtype 构造函数"的自引用调用在部分路径下会触发崩溃或未定义行为。修复后,该调用被明确处理为合法的幂等操作。仓库中 dtype 转换相关的内部实现位于 numpy/_core/src/multiarray/dtype_transfer.c,其中对"同一 dtype 内的转换"(same-dtype cast)有专门注释说明,本次修复正是确保此类路径不进入异常分支。
3.3 规避 Cython 3 的 intp 转换回归(#25095)
Cython 3 对整数类型转换的语义存在变化,可能导致np.intp相关转换出现回归。该 PR 作为 1.26.x 分支的 backport,确保在 Cython 3 环境下扩展模块编译与运行时的整型行为与旧版一致。对使用 Cython 编写 NumPy 扩展的开发者而言,这是升级到 Cython 3 时必须关注的兼容点。
3.4 位域整数改为无符号(#25118)
仓库中位域(bitfield)相关处理涉及 SIMD 掩码向量与整数位域的互转,见 numpy/_core/src/_simd/_simd.dispatch.c.src 中"Convert mask vector to integer bitfield"相关实现。将位域整数显式声明为无符号,可避免符号扩展带来的掩码值异常,属于底层正确性加固。
四、Cython 枚举增强与 ABI 说明(#24955)
本版本唯一的功能性增强(ENH)是为NPY_FR_GENERIC添加 Cython 枚举。NPY_FR_GENERIC是日期时间单位枚举中的"无绑定单位"(unbound units)值,语义为"可转换为任意单位",其 C 定义位于 numpy/_core/include/numpy/ndarraytypes.h:
NPY_FR_GENERIC = 14 /* unbound units, can convert to anything */同时该文件还定义了:
#define NPY_DATETIME_NUMUNITS (NPY_FR_GENERIC + 1) #define NPY_DATETIME_DEFAULTUNIT NPY_FR_GENERIC在 Cython 30 对应的声明文件 numpy/init.cython-30.pxd 中,NPY_FR_GENERIC已随NPY_FR_*单位系列(从周、天、小时直到飞秒、阿秒、仄秒)一并公开给 Cython 用户。此前该枚举在 Cython 侧缺失,导致扩展作者无法直接引用"通用/未绑定单位",本次补充完整了这一日期时间单位的 Cython 可见性。与之配套的运行时行为(如基于meta->base == NPY_FR_GENERIC的分支判断)可在 numpy/_core/src/multiarray/datetime.c 中观察到。
五、构建系统:Meson 选项与平台支持改进
本版本在构建侧改动最多(7 个 BLD PR),核心目标是让 1.26 系列在各种平台与编译环境下都能稳定产出 wheel 与源码安装包。
5.1 allow-noblas 默认值改为 true(#25120)
Meson 构建选项allow-noblas的默认值由 false 调整为 true。当前仓库 meson.options 中的定义如下:
option('blas', type: 'string', value: 'auto', description: 'BLAS library to use (default: autodetect based on `blas-order`)') option('allow-noblas', type: 'boolean', value: true, description: '...') option('blas-order', type: 'array', value: ['auto'], description: 'Preferred search order for BLAS libraries (e.g., mkl, openblas, blis, blas)')该改动意味着:当系统未检测到任何可用 BLAS 库时,Meson 构建不再直接报错退出,而是允许继续以无 BLAS 模式构建 NumPy。这对在没有预装 BLAS 的开发机或受限容器环境中编译源码的用户非常友好——构建可以完成,只是部分依赖 BLAS 的例程性能会退回到 NumPy 自带实现。需要强制要求 BLAS 的构建场景可显式传-Dallow-noblas=false。
5.2 Netlib BLAS/LAPACK 检测改进(#25117)
构建系统改进了对 Netlib 系libblas、libcblas、liblapack的识别逻辑,避免在同时存在多套 BLAS 实现(如系统自带的 Netlib 与用户安装的 OpenBLAS)时误选或漏检。该选项配合blas-order数组可精确控制搜索优先级,例如-Dblas-order=mkl,openblas,blis,blas。
5.3 macOS 回退经典链接器(#24977)
Xcode 15 引入的新链接器在构建 NumPy 时出现问题,本版本明确回退使用经典链接器,保证 macOS 构建的稳定性。对使用较新 Xcode 工具链的 macOS 用户,这是开箱即用的修复,无需手动干预。
5.4 ppc64 Power9 基线与 features.h 检测(#25083、#25093)
两个 PR 分别解决:一是 ppc64 平台将 SIMD 基线设置为 Power9 时的构建失败(作为 backport 修复);二是 Meson 构建流程中features.h的检测问题。这两项属于特定架构的构建加固,对 IBM POWER 平台的用户有直接意义。SIMD 基线配置的检测样例可参考 meson_cpu/ppc64 目录。
5.5 其他构建与打包改进
- #25003:为 musllinux_aarch64 提供 wheel 构建支持,补齐 Alpine Linux 在 ARM64 架构下的二进制分发。
- #24971:构建时运行
tempita.py(模板引擎,见 numpy/_build_utils/tempita.py)改用正确的 Python 解释器,修复特定虚拟环境/多 Python 并存环境下代码生成步骤调用错误解释器的问题。 - #24962:从 release 分支移除 Python 版本上限,允许后续补丁版本灵活适配更新版本的 Python。
- #24972:移除
import_array()中"无帮助的错误替换"逻辑,让错误信息保持原始状态,便于定位真实的导入失败原因。
六、CI 基础设施与工程化调整
本版本将 CI 从 Travis 迁移到 GitHub Actions 生态,并同步了开发工作流:
- #25108:引入
linux_qemuaction 用于在 x86 宿主机上通过 QEMU 模拟运行非 x86 架构(如 s390x、ppc64le)的测试,同时移除 Travis 测试。这与 #24814 中"对齐 test_dispatcher 的 s390x 目标与_umath_tests_mtargets"相配合,保证多架构下的测试目标一致性。 - #25107:移除过时的 CI job,将 macOS 与 conda 相关 job 迁移至新的执行方式。
- #25071:拆分
.github/workflows使其与 main 分支结构保持一致。 - #25112:同步更新
.spin/cmds.py。spin 是 NumPy 采用的本地开发命令工具(如spin test、spin build),保持其与 main 分支一致可避免开发者在 1.26 分支上使用过期命令。 - #25049:更新 Meson 构建基础设施,与上游 Meson 版本演进保持同步。
七、文档与元数据修正
- #25113:在 wheel 包中从视觉上区分主许可证与捆绑的第三方许可证(如 BLAS 库许可),符合打包规范要求,便于审计。
- #25116:修正 OpenBLAS 的许可证标识符(SPDX identifier),此前标识不准确,影响合规检查工具。
- #25043:更新 mailmap,归并贡献者的历史身份记录,属于贡献者元数据维护。
八、升级建议与验证方式
1.26.2 作为纯维护版本,升级风险很低,且无 API 变更。建议以下场景优先升级:
- 使用
np.random.multinomial且n取值较大的应用(受益于 #25119 的长整型修复); - 在 macOS Xcode 15 工具链下从源码构建的用户(受益于 #24977);
- 在无 BLAS 环境中编译源码的用户(受益于 #25120 的默认值调整);
- 使用 Cython 3 编译扩展的开发者(受益于 #25095 回归规避与 #24955 的枚举补齐)。
安装与验证可参考仓库根目录的 INSTALL.rst 与 pyproject.toml。对于源码构建场景,务必注意本版本已将allow-noblas默认打开,若你的部署对 BLAS 例程性能有硬性要求,应显式指定-Dallow-noblas=false并通过-Dblas-order锁定目标库,构建选项的完整清单见 meson.options。对二进制安装用户,可直接升级至本版本并运行numpy.test()做基本回归验证。
结语
NumPy 1.26.2 虽无新特性,却是 1.26 系列通往 2.0 之前的关键加固节点:随机数模块的整型正确性、dtype 边界行为、Cython 3 兼容性、多架构构建与 CI 迁移构成了本次发布的主体。对于将长期停留在 1.26 系列的团队,本版本值得作为基线版本固定使用;对于上游追踪者,这些修复也预示了 2.0 时代在构建与类型体系上的演进方向。
【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考