news 2026/9/19 13:01:59

NumPy 1.26.2 维护版变更解析:回归修复、构建系统改进与 Cython 兼容性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NumPy 1.26.2 维护版变更解析:回归修复、构建系统改进与 Cython 兼容性

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#24955NPY_FR_GENERIC添加 Cython 枚举
REL#24962从 release 分支移除 Python 版本上限
BLD#24971运行 tempita.py 时使用正确的 Python 解释器
MAINT#24972移除import_array()中无帮助的错误替换
BLD#24977macOS 使用经典链接器(规避 Xcode 15 新链接器问题)
BLD#25003musllinux_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#25119np.random.multinomial的 n 改为长整型
BLD#25120allow-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)

经典随机模块mtrandmultinomial的签名在修复后为:

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 中可查。使用该接口时,npvals的校验逻辑不变,但底层整型宽度已与平台 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 系libblaslibcblasliblapack的识别逻辑,避免在同时存在多套 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 testspin build),保持其与 main 分支一致可避免开发者在 1.26 分支上使用过期命令。
  • #25049:更新 Meson 构建基础设施,与上游 Meson 版本演进保持同步。

七、文档与元数据修正

  • #25113:在 wheel 包中从视觉上区分主许可证与捆绑的第三方许可证(如 BLAS 库许可),符合打包规范要求,便于审计。
  • #25116:修正 OpenBLAS 的许可证标识符(SPDX identifier),此前标识不准确,影响合规检查工具。
  • #25043:更新 mailmap,归并贡献者的历史身份记录,属于贡献者元数据维护。

八、升级建议与验证方式

1.26.2 作为纯维护版本,升级风险很低,且无 API 变更。建议以下场景优先升级:

  • 使用np.random.multinomialn取值较大的应用(受益于 #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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 12:59:01

Cocos Creator构建Windows桌面版:从exe到安装包全流程实战指南

最近项目要发布Windows桌面版,产品那边要求给客户一个能双击安装的exe安装包,而不是让用户自己解压文件夹去点运行。我本来以为Cocos Creator构建个Windows平台也就点两下的事,真正走了一遍才发现,从编辑器构建出exe到做出一个合格…

作者头像 李华
网站建设 2026/9/19 12:52:51

Visual Studio 2022 实战安装指南:工作负载、版本选型与故障排查

1. 这不是“点下一步”的安装指南,而是你真正需要的 Visual Studio 2022 实战部署手册Visual Studio 2022 是目前 Windows 平台上最成熟、最完整的集成开发环境(IDE),它远不止是一个“写 C# 的工具”。如果你正在为一个新项目搭建…

作者头像 李华