NumPy 1.21.0 版本发布说明:核心特性、PRNG 演进与工程化升级全解析 NumPy 1.21.0 版本发布说明核心特性、PRNG 演进与工程化升级全解析【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy本篇文章基于 NumPy 官方仓库的 1.21.0 版本变更日志 编写系统梳理该版本引入的新功能、性能优化、弃用项与工程化改进并对照仓库源码与测试用例提供可验证的实现依据。读完本文你将了解 NumPy 1.21.0 的核心变更全景掌握PCG64DXSM、numpy.typing.NDArray等新特性的正确用法并理解其发布与版本管理流程。版本概况175 位贡献者与 581 个合并 PR根据官方变更日志NumPy 1.21.0 共获得175 位贡献者的参与其中带标记的为首次提交补丁的新贡献者累计合并了581 个 pull request。这是 1.x 系列中规模较大的一个版本变更横跨新功能ENH新增位生成器、类型注解、新参数支持等性能优化SIMD围绕 CPU 指令集分派的大量内联汇编级优化弃用DEP为 2.0 时代的 API 清理做铺垫构建与发布BLD/REL版本管理工具链的迁移versioneer、towncrier文档与类型标注DOC/TYP超过百项的文档修正与pyi存根完善。由于 1.21.0 是为 2.0 做准备的版本其变更日志中大量DEP与API条目都指向后续 2.0 的破坏性变更理解这一版本有助于把握 NumPy 演进的节奏。新随机数生成器 PCG64DXSM更安全的 PCG 变体1.21.0 最受关注的新功能之一是新增的位生成器PCG64DXSMPR #18906、#18940。它与既有PCG64同属 ONeill 的 PCG 家族但采用了更强的 DXSM 输出函数。从源码实现看该生成器定义于 numpy/random/_pcg64.pyx其文档字符串明确说明PCG-64 DXSM 是 ONeill 置换同余生成器的 128 位实现周期为 $2^{128}$支持任意步数推进advance以及 $2^{127}$ 个流。与PCG64的区别在于使用更强的 DXSM 输出函数、在 LCG 中使用 64 位 cheap multiplier并且先输出状态再推进而非 advance-then-output。基本用法from numpy.random import Generator, PCG64DXSM, SeedSequence rng Generator(PCG64DXSM(12345)) x rng.standard_normal(10)并行场景配合 SeedSequence.spawn源码文档明确推荐并行场景下使用SeedSequence.spawn派生互不相关的子流from numpy.random import Generator, PCG64DXSM, SeedSequence sg SeedSequence(1234) rg [Generator(PCG64DXSM(s)) for s in sg.spawn(10)]状态与播种细节从 numpy/random/_pcg64.pyx 可以确认状态向量由 2 个 128 位无符号整数构成外部以 Python int 表示一个是 LCG 推进的 PRNG 状态另一个是 LCG 使用的固定奇数增量输入种子统一交给SeedSequence处理生成这两个值增量不可独立设置__init__通过_seed_seq.generate_state(4, np.uint64)获取 4 个 64 位字来初始化状态与增量底层通过pcg64_cm_uint64/pcg64_cm_uint32/pcg64_cm_double等函数指针向Generator提供原生随机数。兼容性保证PCG64DXSM明确承诺固定种子必然产生完全相同的随机整数流见 numpy/random/_pcg64.pyx。测试用例 numpy/random/tests/test_smoke.py 中TestPCG64DXSM与TestPCG64采用相同的推进步长$2^{63}2^{31}2^{15}1与种子[12345]参与全套冒烟测试印证其与既有生成器同等严格的质量验证体系。PCG64 与 PCG64DXSM 对比维度PCG64PCG64DXSM输出函数较弱易受统计攻击影响更强的 DXSM 输出函数LCG 乘法器普通乘法64 位 cheap multiplier输出时机advance-then-output先输出后推进兼容性1.17 默认生成器1.21.0 新增独立流注意1.21.0 中默认随机数生成器仍是PCG64PCG64DXSM作为更安全的替代选项提供。类型注解numpy.typing.NDArray 与平台相关精度推断1.21.0 在静态类型numpy.typing方向投入大量工作核心成果包括新增npt.NDArray别名PR #18935一个可运行时下标操作的np.ndarray别名用于函数签名标注mypy 插件PR #17843、#18322推断平台相关的np.number精度与扩展精度类型大量模块补齐注解np.lib.ufunclike、np.lib.index_tricks、np.lib.arrayterator、np.core.einsumfunc、np.lib.utils、np.core.numerictypes、np.lib.NumpyVersion等PR #18377、#18397、#18545、#18390、#18944、#18818、#18990。NDArray的定义与导出可参见 numpy/typing/init.pyfrom numpy._typing import ArrayLike, DTypeLike, NBitBase, NDArray __all__ [ArrayLike, DTypeLike, NBitBase, NDArray]典型用法import numpy.typing as npt def normalize(x: npt.NDArray[np.float64]) - npt.NDArray[np.float64]: return x / x.max()这批注解工作为 2.x 时代numpy.typing成为正式 API 奠定了坚实基础。弃用与兼容性为 2.0 铺路1.21.0 的弃用公告贯穿多个方向读懂这些DEP条目是升级到 2.x 的关键字符串与数字/布尔值的隐式提升弃用PR #18116、#18999、#19175np.array([a, 1])这类混合提升开始发出FutureWarning最终推迟到后续版本正式失效np.typeDict正式弃用PR #17586np.testing.dec模块弃用PR #18051data_type.dtype属性弃用PR #13578correlate的mode参数解析移入 C 层不再接受非精确的旧解析PR #17492unravel_index的dims参数名最终确立为shapePR #17900对 array-like 要求__len__的未来警告PR #17973禁用PyUFunc_GenericFunction与PyUFunc_SetUsesArraysAsDataPR #18697收紧 C API 面。字符串提升弃用路径的引用计数修复PR #18931、以及推迟字符串与数字提升的弃用/未来警告PR #19175表明这类影响面广的变更采用分阶段策略确保用户有足够迁移窗口。SIMD 与性能优化指令级加速1.21.0 是 SIMD 分派框架NPYVuniversal intrinsics全面铺开的版本围绕 numpy/_core/src 下的 SIMD 代码 展开大量内联优化整数除法改用 libdividefloor dividePR #17727与有符号整数除法PR #18766引入 libdivide 算法将除法转为乘法位移对应新增快速整数除法内建函数PR #18178packbits的 AVX2/AVX512F/VSX 优化PR #17102sin/cos等超越函数迁移到 NPYV 通用内建PR #17587einsum子模块的乘加、dot、sum 优化PR #17782、#17994、#18012、#18194count_nonzero的 SIMD 加速PR #17958、#18183exp/log/frexp/ldexp迁移至 SIMD 分派PR #18101并修复 AVX/AVX512 下的下溢报告问题PR #18920、#18933min/max值比较的 SIMD 实现PR #18863、#18882、#18889旧 CPU 分派器算术部分被 NPYV 取代PR #17985。配套地构建系统新增了对 x86 基线ubuntu-20.04 native baselinePR #17960、ppc64le、FreeBSD ARM、Fujitsu 编译器PR #17792、Apple M1PR #18538等平台与编译器的支持与修复。工程化升级versioneer 与 towncrier 发布流程1.21.0 完成了两项重要的工程化迁移版本管理迁移到 versioneerPR #17956、#17974、#18205由 git 标签自动推导版本号并支持时间戳标记开发版本PR #17886从工具链层面避免版本漂移发布说明改用 towncrier 聚合PR #18790、#18982、#18930开发者只需在 doc/release/upcoming_changes 目录下按PR号.类型.rst命名提交新闻片段。新闻片段的规范见 doc/release/upcoming_changes/README.rst类型包括new_function、deprecation、future、expired、compatibility、c_api、new_feature、improvement、performance、typing、change、highlight。发布时执行towncrier build --version version该命令详见 doc/HOWTO_RELEASE.rst 的发布流程说明。本地预览可使用towncrier build --draft --version 1.18这一机制保证了 changelog 与每个 PR 一一对应、可追溯——本文所依据的 1.21.0-changelog.rst 正是该流程的产物。其他值得关注的变更numpy.save对小数组的性能改进PR #18657mean/var的where关键字修复PR #18560unique对 NaN 条目的正确处理PR #18070np.in1d对 object 数组的 bug 修复PR #18369tril_indices/triu_indices性能提升PR #18176piecewise子类安全化PR #18110np.clip文档补充a_min a_max特殊用例说明PR #18786。结语NumPy 1.21.0 是一个承上启下的版本新增PCG64DXSM强化随机数基础设施类型注解体系走向成熟SIMD 优化大规模落地同时通过一波有条不紊的弃用为 2.0 清理 API 面。对开发者而言建议重点关注字符串提升弃用带来的迁移工作并将新代码中的随机数场景优先考虑PCG64DXSM。深入阅读本仓库中的 numpy/random/_pcg64.pyx、numpy/typing 与 numpy/random/tests/test_smoke.py可以进一步验证本文涉及的全部实现细节。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考