资讯动态

NumPy 2.1.2 维护版本发布详解:14 项修复的源码级解析与升级指南

发布时间:2026/9/20 13:25:57 来源:尧图企业网站定制
NumPy 2.1.2 维护版本发布详解14 项修复的源码级解析与升级指南【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpyNumPy 2.1.2 是紧随 2.1.1 之后发布的维护版本maintenance release专注于修复 2.1.1 发布后暴露的缺陷与回归问题不引入新功能。本文以官方发布说明 doc/source/release/2.1.2-notes.rst 为主线结合当前仓库源码逐项拆解本次 14 个合并 PR 背后的技术细节涵盖多线程 dispatch 缓存安全、np.roll无符号位移、rfftn轴处理、ARM SVE 排序回退以及 Windows/打包链路修复。读完本文你将清楚理解每个修复的触发场景、对应的源码位置与验证方式能够据此评估是否升级并快速排查相关回归。版本概况与支持范围NumPy 2.1.2 面向 2.1.x 系列用户定位是纯修复型维护版本。官方发布说明明确其目的为修复 2.1.1 发布后发现的 bug 与回归bugs and regressions。支持的 Python 版本3.10–3.13当前仓库主线 pyproject.toml 的requires-python为3.12属于后续开发分支 2.6.0.dev0 的要求与本维护版本适用的 3.10 范围并不冲突升级时以发布版本的元数据为准。贡献规模共 11 人参与其中 4 人Ishan Koradia、João Eiras、Katie Rust、Slava Gorloff为首次贡献补丁的新人。合并 PR 数量14 个。这批修复覆盖面很广从多线程运行时安全、数值 API 行为一致性到 ARM 架构 SIMD 回退、Windows 构建工具链、CI 依赖再到打包工具链升级。下面按主题分组展开。多线程与并发安全dispatch 缓存的临界区保护#27400修复内容在填充 ufunc 的 dispatch 缓存dispatch cache时应用临界区critical section保护。这是 NumPy 2.x 为支持自由线程free-threaded /Py_GIL_DISABLED构建所做并发安全改造的一部分。ufunc通用函数在执行前需要根据操作数的 DType 解析出最合适的实现ArrayMethod这一分派结果会被缓存下来避免每次重复解析。相关核心逻辑位于 numpy/_core/src/umath/dispatching.cpppromote_and_get_info_and_ufuncimpl()是主分派实现注释中明确说明结果缓存在 ufunc 的 dispatch cache 中以加速后续查找缓存结构本身是PyArrayIdentityHash挂在 ufunc 对象的_dispatch_cache字段上见 numpy/_core/include/numpy/ufuncobject.h写入时使用PyArrayIdentityHash_SetItemDefault其语义是仅当条目不存在时写入否则返回已存在的值从而保证并发 cache miss 时只有一个线程真正写入、其余线程复用结果。在没有 GIL 的构建下这个先读后写过程必须用临界区包裹才能避免数据竞争。仓库为此在 numpy/_core/src/common/npy_pycompat.h 中提供了专门的宏NPY_BEGIN_CRITICAL_SECTION_SEQUENCE_FAST/NPY_END_CRITICAL_SECTION_SEQUENCE_FAST在Py_GIL_DISABLED分支下调用 CPython 的PyCriticalSection_Begin/End做细粒度加锁并在非自由线程构建下展开为空操作保证零额外开销。验证依据多线程专项测试 numpy/_core/tests/test_multithreading.py 中明确写道如果 loop data cache 或 dispatch cache 不是线程安全的多线程同时计算 ufunc 会导致随机崩溃并通过run_threaded高频并发调用 ufunc 来验证。可见该修复属于 2.1.x 对自由线程准备工作的持续跟进。数值 API 行为修复np.roll 无符号位移、rfftn 轴处理、array_function崩溃np.roll 允许无符号位移参数#27437np.roll(a, shift, axisNone)用于沿指定轴滚动数组元素是科学计算与图像处理中的高频工具实现在 numpy/_core/numeric.py。此前将shift传入时会经过有符号整数路径导致无符号类型如numpy.uint64的大数值被误判为负数而报错或行为异常。本次修复让shift参数正确接受无符号整数。仓库测试 numpy/_core/tests/test_numeric.py 的test_roll_unsigned_shift给出了验证用例# shift 与 np.roll(x, 2) 等价无符号 2 assert_equal(np.roll(x, shift), np.roll(x, 2)) # 2**100 超出数组长度时按模滚动结果等于原数组 assert_equal(np.roll(x, 2**100), x)这一行为与np.roll的文档语义一致位移量超过数组长度时元素循环回绕roll beyond the last position are re-introduced at the first因此大无符号值按模运算后自然回到原数组属于合理且可预期的行为。rfftn 的 axis 参数处理#27471rfftn是实数输入的 n 维离散傅里叶变换与fftn同实现于 numpy/fft/_pocketfft.py底层由_pocketfft_umathC 扩展numpy/fft/_pocketfft_umath.cpp驱动。该修复针对的是rfftn在特定axes组合下的轴处理错误——当用户显式指定非默认轴时实数变换对最后一轴的半频谱特殊处理可能与用户指定的轴不一致导致输出形状或取值错误。修复后axes参数按用户意图严格生效。由于rfftn家族rfft2、irfftn、irfft2等共享同一底层路径此修复同时惠及整个实数 FFT 家族。避免 ndarray.array_function的段错误#27506__array_function__是 NumPy 的分派协议由 NEP 18 定义允许第三方数组库在调用 NumPy 函数时接管实现。其 C 层核心实现在 numpy/_core/src/multiarray/arrayfunction_override.cget_array_function()负责快速提取对象上的__array_function__方法array_function_method_impl()是ndarray.__array_function__的核心实现并针对默认实现即ndarray自身的__array_function__做了快速路径优化。本次修复针对的是**传入非法参数时可能触发段错误segfault**的问题当__array_function__协议收到构造不良的参数如类型列表、参数元组与函数签名不匹配时原先的解析路径可能访问空指针。修复后在错误参数场景下能够干净地抛出异常而非崩溃提升了 NumPy 与外部数组库互操作时的健壮性。修正 PyArray_UInt8DType 的额外 decref#27479这是典型的引用计数refcount泄漏/越界释放类修复。PyArray_UInt8DType是uint8的 DType 单例在 NumPy 2.x 的 DType 系统中其引用计数管理必须精确多一次Py_DECREF会导致提前释放少一次则泄漏。该 PR 移除了错误路径上多余的Py_DECREF消除潜在的内存安全风险。这类修复通常在 DType 实例化、缓存复用等低频但关键的路径上生效是维护版本中典型且必要的正确性修复。ARM SVE 相关禁用 VQSort 与按需检测 SVE#27439、#27481两个 PR 共同完善了 NumPy 在 ARM 可扩展向量扩展SVEScalable Vector Extensions平台上的行为#27439 禁用 SVE VQSortNumPy 的排序内核在支持 Highway 的平台上使用VQSortStatic见 numpy/_core/src/npysort/highway_qsort.dispatch.cpp 与 16 位变体 numpy/_core/src/npysort/highway_qsort_16bit.dispatch.cpp。在部分 ARM SVE 硬件上该快速排序实现存在缺陷因此 2.1.2 回退到通用排序路径避免错误结果或崩溃换取确定性的正确性。#27481 按需检查 SVE 支持NumPy 的 CPU 特性检测集中实现在 numpy/_core/src/common/npy_cpu_features.cSVE 特性 ID 定义于 numpy/_core/src/common/npy_cpu_features.hARM64 上通过读取hwcap寄存器的NPY__HWCAP_SVE位来判定见 numpy/_core/src/common/npy_cpuinfo_parser.h。该 PR 将 SVE 的检测改为按需on demand进行避免在启动阶段无条件执行 SVE 探测——在部分模拟器或虚拟化环境中 SVE 指令探测本身可能触发非法指令SIGILL按需检测能显著提升这些环境下的导入稳定性。两者配合先保证排序路径正确再让特性探测过程自身更安全。构建与打包链路Windows 工具链、C23 编译、setuptools 与 cibuildwheelWindows缺失 distutils.msvccompiler 时安全降级#27406get_build_msvc_version是构建脚本用于探测 MSVC 编译器版本的辅助函数其实现依赖distutils.msvccompiler。当用户的 Python 环境缺少该模块时原先的导入会直接失败导致构建过程中断。本次修复将其 stub 化stub out在模块缺失时返回合理的降级结果使构建流程能够继续增强了在精简 Python 发行版上的可用性。C23 兼容补全 std::ptrdiff_t 头文件#27416当使用 C23 标准编译 NumPy 的 C 代码时std::ptrdiff_t需要显式引入cstddef头文件旧标准下可能被其他头文件间接包含。该 PR 为相关源码补充了缺失的 include属于典型的新语言标准暴露隐藏依赖的构建修复确保使用现代编译器默认启用更新标准的用户可以顺利编译。固定 setuptools 版本保护 numpy.distutils#27433numpy.distutils是 NumPy 提供的兼容层许多老项目仍在构建脚本中使用from numpy.distutils.core import setup。新版 setuptools 对distutils的迁移和废弃改动可能破坏numpy.distutils的运行时行为因此 2.1.2 将构建依赖中的 setuptools 固定pin到兼容版本防止依赖漂移导致构建失败。这类锁定依赖是维护版本中常见的防御性措施。升级 pypa/cibuildwheel 至 2.21.2#27501CI 打包工具cibuildwheel由 2.20.0 升级至 2.21.2。cibuildwheel 用于在 CI 中为多平台构建 wheel当前仓库的 wheel 构建脚本可见 tools/wheels/cibw_before_build.sh 与 tools/wheels/cibw_test_command.sh此次升级主要是跟随上游修复改善各平台打包的稳定性不涉及 NumPy 运行时行为变化。CI 与依赖管理文档 CI 改用 PyPI wheels#27480此前 NumPy 的文档构建 CI 依赖scientific-python-nightly-wheelsSciPy 科学 Python 生态的每日构建 wheel 源该源存在不稳定性且与实际发布版本存在偏差。本次修复将文档 CI 改为使用 PyPI 上的正式发布 wheel使文档构建环境更稳定、更贴近用户实际安装的版本也减少了对夜间构建服务的依赖。维护性提交#27333prepare 2.1.x for further development是标准的版本分支维护提交在发布后重置版本号、更新变更日志占位与分支元数据为 2.1.x 系列的后续维护开发做准备。这类提交本身不改变行为但保证了发布流程的可追溯性。升级建议与回归验证NumPy 2.1.2 属于 2.1.x 系列内部的补丁升级理论上与 2.1.1 完全 API 兼容升级成本低。以下用户尤其建议升级多线程 / 自由线程使用者dispatch 缓存临界区修复#27400直接关系到并发 ufunc 调用的稳定性配合 numpy/_core/tests/test_multithreading.py 中的并发回归测试可显著降低随机崩溃概率。ARM SVE 平台用户VQSort 回退#27439与按需 SVE 检测#27481让排序结果与导入过程在部分 ARM 硬件/虚拟化环境更可靠。使用np.roll处理大位移量、使用rfftn自定义轴、或与自定义__array_function__库如 Dask、CuPy、xarray 生态互操作的用户三处行为修复都直接改善这些场景。升级后可用仓库中的测试集做快速回归核心数值行为可运行 numpy/_core/tests/test_numeric.py覆盖test_roll_unsigned_shift等新用例FFT 相关验证可运行 numpy/fft/tests 下的测试模块并发安全则可借助test_multithreading.py验证。总结NumPy 2.1.2 虽然改动量不大14 个 PR却精准覆盖了维护版本应关注的全部维度多线程并发安全、数值 API 行为一致性、特定硬件ARM SVE回退、构建工具链与 CI 稳定性。对于生产环境而言这类小步快跑的维护版本正是风险最低的升级窗口——建议在常规测试通过后尽快跟进以获得上述正确性与稳定性修复。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价