拓冰建站拓冰建站
首页 / 资讯中心 / 正文

NumPy 1.25.2 维护版本发布详解:1.25 系列收官之作的 Bug 修复与技术内幕

NumPy 1.25.2 维护版本发布详解1.25 系列收官之作的 Bug 修复与技术内幕【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy导读本文基于 doc/source/release/1.25.2-notes.rst 发布说明系统梳理 NumPy 1.25.2 作为1.25.x 系列最后一个维护版本的定位与全部修复内容。该版本集中修复了 1.25.1 之后暴露的若干 Bug 与回归问题涵盖ufunc.at负索引、np.histogram小范围数据、标量字符串引用计数泄漏、np.array_api.take签名错误等底层缺陷。阅读本文你将掌握这 19 个合并 PR 各自解决的具体问题、对应的源码位置与验证方法并了解 1.25.x 与后续 1.26.0 在构建体系Meson和 Python 版本支持上的演进脉络。版本定位1.25.x 系列的最后一次维护发布根据发布说明原文NumPy 1.25.2 是一个maintenance release维护版本其使命是修复 1.25.1 发布之后被发现的各种 Bug 与回归regressions。它同时被明确标注为1.25.x 系列中最后一个计划发布的版本后继版本 1.26.0 将切换到Meson 构建系统仓库根目录下的 pyproject.toml 与 meson.options 即为当前 Meson 构建配置的体现另有 building_with_meson.md 专门介绍该构建流程增加对Python 3.12的支持。而 1.25.2 本身支持的 Python 版本范围为3.9 至 3.11。需要特别说明的是当前仓库主分支已演进到远高于 1.25.2 的版本因此本文引用的源码路径均来自仓库现状用于印证 1.25.2 修复点所涉及的底层实现仍在持续演进具体行为细节请以对应发布版本为准。贡献者与合并 PR 概览本次发布共有13 位贡献者参与其中带 标记的 Randy Eckenrode 与 Sam James 为首次贡献补丁的新人。13 位贡献者名单如下Aaron Meurer、Andrew Nelson、Charles Harris、Kevin Sheppard、Matti Picus、Nathan Goldbaum、Peter Hawkins、Ralf Gommers、Randy Eckenrode () 、Sam James ()、Sebastian Berg、Tyler Reddy以及自动依赖更新机器人 dependabot[bot]。本次发布共合并19 个 Pull Request按类型可划分为四类Bug 修复BUG、构建/编译调整BLD/ENH/MAINT、文档/CI 维护CI/MAINT与依赖升级MAINT。下面按技术主题分组深入解读。核心 Bug 修复与底层原理1.ufunc.at负索引处理与输入不可变保证本次修复中最为关键的两项都与ufunc.at相关PR #24183BUG: properly handle negative indexes in ufunc_at fast path修复ufunc.at快速路径fast path中负索引未正确处理的问题。PR #24294BUG: do not modify the input to ufunc_at修复ufunc.at意外修改输入数组的缺陷确保at操作不改变传入的索引/操作数内容。ufunc.at是无缓冲unbuffered的就地操作允许在索引处执行带有重复索引的累加如np.add.at(a, [0, 0], 1)会把a[0]增加两次其 C 实现位于 numpy/_core/src/umath/ufunc_object.c。从源码可以看到快速路径trivial_at_loop通过new_array_op构造临时操作数并利用iter-fancy_dims[0]在内部循环中把负索引换算为实际偏移/* * The value of iter-fancy_dims[0] is added to negative indexes * inside the inner loop */ steps[3] iter-fancy_dims[0];该段注释直接对应 PR #24183 修复的负索引逻辑而 PR #24294 则保证了上述路径不会改写输入。与之配套的回归测试可在 numpy/_core/tests/test_ufunc.py 的test_ufunc_at_negative等测试中看到另有 numpy/_core/tests/test_mem_overlap.py 对ufunc.at与内存重叠场景做了系统性校验确保修复不引入新的别名/重叠问题。2.setflags中的 Python 对象错误处理PR #24184BUG: PyObject_IsTrue and PyObject_Not error handling in setflagsndarray.setflags用于控制数组的写权限write、对齐align与底层数据归属uic其部分参数接受可被布尔化的对象。修复前PyObject_IsTrue与PyObject_Not的返回值未做错误检查一旦对象求值过程抛出异常错误标志可能被吞掉。该修复补上了错误传播路径。3.np.histogram小范围数据的鲁棒性PR #24185BUG: histogram small range robust当传入数据的取值范围range非常小时np.histogram在自动分箱bin估算过程中可能出现数值不稳定问题。自动分箱的核心实现在 numpy/lib/_histograms_impl.py 中该模块提供了sqrt、sturges、rice、scott、stone、doane等一组分箱估算器例如_hist_bin_stone通过最小化估计积分平方误差ISE来选择分箱数而_hist_bin_sqrt直接使用ptp / sqrt(n)形式的计算。当 range 极小导致ptp_x峰峰值接近机器精度时这些估算易产生病态结果本次修复即针对此类边界情况增加了鲁棒性处理。4.np.array_api.take函数签名修复PR #24242BUG: Fix the signature for np.array_api.takenumpy.array_api是遵循 Python 数组 API 标准见 doc/neps/nep-0047-array-api-standard.rst的命名空间。本次修复纠正了array_api.take的函数签名使其与数组 API 标准规定的参数形态一致。主命名空间中take的规范实现位于 numpy/_core/fromnumeric.py其完整签名与mode参数raise、wrap、clip行为可互为参照。5.str(scalar)的引用计数泄漏PR #24244BUG: Fix reference count leak in str(scalar).str()作用于 NumPy 标量如str(np.float64(1.5))时存在引用计数泄漏长时间运行的进程中反复调用会导致内存持续增长。该 PR 修复了标量到字符串转换路径中的引用计数管理问题。6. 内存策略警告路径中的慢getenv调用PR #24255BUG: Factor out slow getenv call used for memory policy warning在 NUMA 等大内存多插槽系统上NumPy 会在启动时探测内存分配策略并可能发出警告而探测过程在每次调用中都重复执行较慢的getenv。该 PR 将该调用重构为只执行一次factor out消除了热路径上的重复开销。7.scalartypes中的 C 类型修正PR #24293BUG: Fix C types in scalartypes修正了标量类型相关 C 代码中的类型声明问题如npy_intp与平台相关的位宽声明属于典型的跨平台正确性修复。8. 无效函数指针转换错误PR #24245BUG: fix invalid function pointer conversion error修复了 C 代码中把函数指针在不兼容类型间直接转换invalid function pointer conversion的编译错误。这类问题在启用严格编译告警如-Werror或使用 Clang 严格模式时会导致构建失败。9. 索引循环的进一步修复与测试PR #24295BUG: Further fixes to indexing loop and added tests作为对先前索引相关修复的延续本次进一步修补了索引循环indexing loop中的缺陷并同步补充了测试用例属于对 numpy/_core/src/multiarray/mapping.h 所描述的索引机制的加固。构建、编译与依赖调整10. Clang-cl 兼容性改进PR #24174ENH: Improve clang-cl compliance提升 NumPy 对clang-clWindows 上以 MSVC 命令行兼容方式运行的 Clang 编译器的兼容性使 Windows 用户在非 MSVC 工具链下也能顺利编译。11. macOS 上 Clang 的-ftrapping-mathPR #24182BLD: use -ftrapping-math with Clang on macOS在 macOS 上使用 Clang 构建时显式添加-ftrapping-math编译选项。浮点异常捕获trapping语义对 NumPy 这类依赖 IEEE 754 浮点异常状态如通过npy_clear_floatstatus_barrier清空浮点状态位见 numpy/_core/src/umath/ufunc_object.c的数值库至关重要该选项保证优化器不会改变浮点异常行为。12. OpenBLAS 更新至中间提交PR #24243BLD: update OpenBLAS to an intermediate commit将默认的 OpenBLAS 依赖更新到某个中间提交通常用于在正式发布之间吸收关键修复或规避已知回归。13. 构建依赖升级PR #24179MAINT: Upgrade various build dependencies与PR #24241MAINT: Dependabot updates升级了各类构建依赖包括由 dependabot 自动提交的依赖更新。仓库 requirements/build_requirements.txt 展示了当前主分支的构建依赖清单如 Meson、Cython 等可作为理解该方向演进的参考。14. Meson 构建文件同步PR #24186MAINT: Update meson.build files from main branch将meson.build文件从主分支同步到 1.25.x 维护分支为后续迁移到 Meson 构建体系做铺垫1.26.0 将正式启用 Meson。公共 API 与命名空间调整15.min、max、round从np.__all__中排除PR #24234MAINT: exclude min, max and round from np.all将min、max、round从np.__all__中移除。原因是这三个名称与 Python 内置函数同名若保留在__all__中执行from numpy import *时会覆盖内置的min/max/round造成隐式行为变更。从 numpy/init.py 可以看到__all__是由各子模块的__all__并集动态构造的__all__ list( __numpy_submodules__ | set(_core.__all__) | set(_mat.__all__) | set(lib._histograms_impl.__all__) | ... {emath, show_config, __version__, __array_namespace_info__} )尽管该 PR 是从__all__层面排除这些名称np.min、np.max、np.round作为属性仍然可用例如np.round定义于 numpy/_core/init.py 相关别名区域只是不再出现在通配符导入的公开名单中。文档与 CI 修复16. Cirrus CI 配置 URL 修正PR #24292CI: correct URL in cirrus.star [skip cirrus]修正.cirrus.star配置文件中的 URL 地址属于纯 CI 基础设施维护不涉及运行时行为。修复内容的测试验证路径对于希望验证 1.25.2 修复效果的读者仓库提供了可直接运行的测试用例作为参照ufunc.at相关回归numpy/_core/tests/test_ufunc.py中的test_ufunc_at_negative、test_ufunc_at_basic等ufunc.at内存重叠numpy/_core/tests/test_mem_overlap.py中的test_ufunc_at_manual标量类型与内存numpy/_core/tests/test_nep50_promotions.py中覆盖 NEP 50 弱标量语义下ufunc.at的行为直方图自动分箱numpy/lib/tests目录下针对histogram的测试。在 1.25.2 对应源码树中执行python -m pytest numpy/_core/tests/test_ufunc.py -k ufunc_at即可定向回归验证相关修复。升级建议若你仍处于 1.25.x 版本线1.25.2 是该系列最后的维护版本建议将其作为 1.25.x 的最终目标版本再规划向 1.26.0Meson 构建、Python 3.12 支持的迁移若你正在使用ufunc.at做重复索引累加、在极小 range 上调用np.histogram或长期运行依赖str(scalar)的服务1.25.2 的修复值得立即跟进迁移到 1.26.x 前请关注 1.26.0 发布说明中关于构建系统切换与 Python 版本支持变化的影响可参考 doc/source/release/1.26.0-notes.rst。总结NumPy 1.25.2 作为一个规模精简19 个 PR但针对性明确的维护版本重点覆盖了数值计算最核心路径上的缺陷ufunc.at的负索引与输入保护、histogram的数值鲁棒性、标量字符串化的内存泄漏以及一组构建与跨编译器兼容性修复。它既是 1.25.x 系列的收官之作也为 1.26.0 的 Meson 构建转型做好了铺垫对仍在 1.25 系列上的生产环境具有明确的升级价值。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门