Numba 发布历史全解读:从 0.57 到 0.2 的功能演进、弃用策略与依赖升级路线图
【免费下载链接】numbaNumPy aware dynamic Python compiler using LLVM项目地址: https://gitcode.com/gh_mirrors/nu/numba
Numba 是一款基于 LLVM 的 NumPy 感知的动态 Python 编译器(当前仓库项目描述即 “NumPy aware dynamic Python compiler using LLVM”),其官方发布说明沉淀了大量关于 Python/NumPy 功能覆盖、CUDA 目标演进、编译器内核改造与依赖升级的权威信息。本文以仓库中的 docs/source/release-notes.rst 为骨架,完整梳理从 0.57.1(2023 年 6 月)回溯至 0.2 的版本脉络,帮助你理解 Numba 的架构演变、弃用时间线以及如何据其规划升级路径。
一、先读懂文档结构:两份 release notes 的分工
在仓库中,Numba 的发布说明由两个入口共同组成:
- docs/source/release-notes-overview.rst:文档目录入口,分为两部分。
Towncrier generated notes小节通过 toctree 以倒序(:reversed:)聚合 docs/source/release/ 目录下的*.rst文件(即 0.58.0 及之后各版本的发布说明,由 towncrier 工具从碎片化 changelog 片段自动生成);Non-Towncrier generated notes小节则直接引用本篇文章的主体 docs/source/release-notes.rst。 - docs/source/release-notes.rst:手工维护的发布说明,按时间倒序覆盖 0.57.1 至 0.2 的全部版本,是目前仓库中信息密度最高、跨度最大的一份版本史资料。
这种「历史手工维护 + 新版本 towncrier 生成」的双轨结构本身就是一个值得注意的工程实践:从 0.58 起,社区用 towncrier.toml + docs/upcoming_changes/ 的片段式 changelog 取代了整篇手写,使每个 PR 只需新增一个小片段即可自动汇入发布说明,同时保留历史文档原样不动的可追溯性。
二、版本支持矩阵:Python / NumPy / LLVM 的三线演进
通读全部发布说明可以发现,Numba 每个版本最重要的信息往往是「支持什么、放弃什么」。以下是文档中明确记载的关键升级节点:
Python 版本线
| 版本 | Python 变更 |
|---|---|
| 0.57.0 | 正式支持Python 3.11,最低版本提升至3.8 |
| 0.55.0 | 支持Python 3.10 |
| 0.53.0 | 支持Python 3.9 |
| 0.49.0 | 移除全部 Python 2 相关代码,最低版本提升至3.6 |
| 0.47.0 | 最后一个支持 Python 2 / 3.5 的主版本(遵循 NumPy NEP 29 弃用节奏) |
| 0.39.0 | 第一个支持 Python 3.7 的版本 |
值得注意的是,0.56.0 明确提示「这是最后一个支持 Python 3.7 的版本」,0.57 直接跳至 3.8 基线并完成 3.11 支持(对应 PR #8545、#8590、#8639 等一批 Python 3.11 兼容性修复,涉及字节码 opcode 拼写变化、CALL_FUNCTION_EX处理、tracing 支持等)。
NumPy 版本线
- 0.57.0:支持NumPy 1.24,最低版本提升至1.21;
- 0.55.2:维护性支持NumPy 1.22与 Apple M1;
- 0.55.0:支持NumPy 1.21(因 NumPy CVE-2021-33430 绕过常规流程加速发布);
- 0.54.0:支持NumPy 1.20,运行时最低版本提升至 1.17(编译仍兼容 1.11);
- 0.52.0:支持NumPy 1.19;
- 0.50.0:支持NumPy 1.18;
- 0.44.1 / 0.43.1:支持NumPy 1.17 / 1.16;
- 0.22.0:支持NumPy 1.10。
LLVM 版本线(经 llvmlite 传递)
文档中可检索到的升级记录:0.57 起LLVM 14全平台支持(PR #8535、#8809)→ 0.54 起 LLVM 11 → 0.51 起 LLVM 10 → 0.50 起 LLVM 9 → 0.44 起 LLVM 8(ppc64le 因 bug 停留在 7.x)→ 0.42 起 LLVM 7 → 0.38 起 LLVM 6 → 0.36.1 起 LLVM 5 → 0.32 起 LLVM 4 → 0.31 起 LLVM 3.9.1 → 0.29 起 LLVM 3.8。这条线的含义是:Numba 的代码生成能力与上层 vectorization(含 SVML)支持完全由 LLVM 版本驱动,升级 LLVM 往往伴随自动向量化机会的增加(如 0.38 明确记载「LLVM 6.0 提升通用向量化」)。
平台与打包
- 0.57.0:最后一个由 Numba 团队发布 Windows 32 位包的版本;
- 0.56.0:最后一个提供 linux-32 包的版本;
- 0.53.0:BSD 系统非官方支持(0.52 起);
- 0.39.0:新增ppc64le架构支持;
- 0.57.0:
setuptools变为可选运行时依赖;TBB 线程层要求2021.6 或更新;0.54 起 TBB 仅支持 2021 系列(ABI 破坏性变更)。
三、Python 语言支持增强:从基本语法到语言特性
发布说明中「Python language support enhancements」板块记录了 Numba 对 Python 语义的逐步逼近。以信息量最大的 0.57.0 为例:
- 异常类支持非编译期常量的参数(PR #8134);
- 内建
hasattr/getattr支持编译期常量属性(PR #7884、#8442); - 内建
str/repr按 Python 语义实现,自定义__str__/__repr__可关联到类型上正常工作(PR #8442); str.startswith支持start/end关键字参数(PR #8557),Unicode__getitem__改为返回视图、避免分配;min/max支持布尔类型(PR #8677);- 支持
dict(iterable)构造器(PR #8334)。
更早版本的关键语言特性包括:0.54.0 的基础 f-string 支持、dict 推导式、内建sum();0.55.0 的实验性isinstance支持(通过部分字面量传播 pass 实现,PR #7244);0.47.0 的基础try/except支持、闭包/lambda作为函数参数、numba.literal_unroll(异构元组/常量列表迭代);0.34.0 的列表推导式与闭包支持。0.52.0 则补齐了 Python 3.10 下大型内联字典与超多关键字参数的调用问题,并支持operator.mul作用于列表、字面量 slice(如slice(1, 10, 2))的返回。
这些条目共同说明 Numba 的「语言子集」一直在向 CPython 语义收敛,且每次语言特性落地都伴随numba/cpython/下对应实现模块的扩充(如 numba/cpython/unicode.py、numba/cpython/builtins.py)。
四、NumPy 功能覆盖的持续扩张
NumPy 支持是 Numba 的核心价值之一,发布说明中每版都有大量新增函数清单。
0.57.0:numpy.random.Generator全面落地
这是 0.57 最大的 NumPy 特性集:绝大多数常用分布已支持,文档明确列出的方法包括beta、chisquare、exponential、f、gamma、geometric、integers、laplace、logistic、lognormal、logseries、negative_binomial、noncentral_chisquare、noncentral_f、normal、pareto、permutation、poisson、power、random、rayleigh、shuffle、standard_cauchy、standard_exponential、standard_gamma、standard_normal、standard_t、triangular、uniform、wald、weibull、zipf。实现位于 numba/np/random/(对应 PR #8038、#8040、#8041、#8042 的 BitGenerator 支持系列,以及 #8520 的非中心卡方/非中心 F/logseries)。0.56.0 已先期支持Generator实例的传入、使用与返回(当前仅random分布)。
同期 0.57 还新增:ndarray 的nbytes属性(PR #8662)、嵌套数组类型(PR #8120)、datetime/timedelta到int的转换(PR #8024)、ufunc 生成中的F-order 迭代(提升 F 序数组组合性能,PR #7622),以及np.argpartition、np.isclose、np.nan_to_num、np.new_axis、np.union1d(PR #5544、#7067、#8623、#8513、#8732)。
0.56.0 / 0.55.0 / 0.54.0 的代表性新增
- 0.56.0:
np.broadcast_shapes、np.broadcast_arrays、min/max支持np.timedelta64/np.datetime64、np.sort支持沿最后一轴的多维排序、np.clip的a_min/a_max接受数组、np.empty/np.ones等分配函数支持enum.IntEnum形状成员、np.random.noncentral_chisquare; - 0.55.0:
np.broadcast_to、np.float_power、np.cbrt、np.logspace、np.take_along_axis、np.average、np.argmin支持axis、ndarray.astype支持字面量字符串类型; - 0.54.0:
np.clip、np.iscomplex/np.iscomplexobj/np.isneginf/np.isposinf/np.isreal/np.isrealobj/np.isscalar、np.random.dirichlet、np.rot90、np.swapaxes、np.argmax支持axis、0d 数组作标量用于__setitem__。
更早期的里程碑包括 0.52.0 的np.asfarray、record 数组子类型化、np.split/np.array_split、NumPy 1.19、dtype 字符串字面量;0.47.0 的np.gcd/np.lcm、np.linalg系列、带key的sorted/list.sort();0.45.0 引入实验性numba.typed.List;0.43.0 引入静态类型化字典(typing Dict)。这些实现大多集中在 numba/np/arraymath.py、numba/np/linalg.py 与 numba/np/npdatetime.py。
五、编译器内核与 NRT 运行时:性能与安全的结构性改进
发布说明中「Highlights of core changes」「Performance」板块揭示了 Numba 内部的长期工程主线——把编译器从「能用」推向「高效且可扩展」。
NRT(Numba Runtime)演进
- 0.57.0:NRT 内部统计计数器默认关闭(消除原子锁竞争)、调试缓存行填充默认关闭、NRT 延迟到首次编译时才初始化(改善导入速度)、所有分配调用默认走 "checked" 层(PR #8200、#8235、#8438);
- 0.46.0:NRT C-API 重构;
- 0.52.0:Intel 资助的LLVM 级引用计数剪枝 pass,减少原子锁压力并让优化器做得更多;
- 0.33.0:消除循环体内冗余引用计数操作,受影响程序提速 2–10 倍。
相关实现可参考 numba/core/runtime/nrt.py 与 numba/core/runtime/ 目录。
扩展 API 的大规模迁移
0.57.0 记载了一次重要的内部重构:把大量 Python/NumPy 函数的内置实现从低层扩展 API 迁移到高层扩展 API(numba.extending),例如用@overload取代@overload_glue(PR #8234、#8431、#8649 等 20+ 个函数),并删除了numba.core.overload_glue模块。同时:
@overload*与@intrinsic的默认target改为"generic",使扩展默认同时被 CPU 与 CUDA 目标接受(PR #8554);types.float64[:, ::1]这类对 Numba 类型的__getitem__现在可在编译代码中使用(PR #8819);- Numba 类型支持
__repr__(PR #8685)。
更高层的 API 演进还包括 0.54.0 的@overload_classmethod、0.51.0 的StructRef(按引用传递的可变结构扩展类型)、0.46.0 的入口点(entrypoints)扩展注册机制,以及 0.38.0 的自定义编译管线(custom pipeline)与numba.extending.get_cython_function_address。这些接口的权威文档见 docs/source/extending/ 与 numba/extending.py。
IR 与编译管线
- 0.49.0:引入基于
ir.Del的自由静态单赋值(SSA)形式的 NIR,并把代码库按功能重组成numba.core等子模块(提供 shim 过渡,0.50.0 移除); - 0.52.0:开启 SLP(superword-level parallelism)向量化并调优优化管线;新增
inspect_cfg增强、LLVM pass 计时(0.53.0); - 0.46.0:编译器管线重构为更易扩展的形态,配合自定义 pass 文档;
- 0.55.0:新增
NUMBA_CAPTURED_ERRORS='new_style'错误处理模式——凡不继承numba.errors.NumbaException的异常一律视为硬错误并立即展开栈,大幅改善@overload编写时的调试体验。
六、并行加速器(ParallelAccelerator)与 parfors
Numba 的自动并行化技术自 0.34.0 引入(parallel=True与显式prange),此后持续增强:
- 0.57.0:parfor gufunc 不再执行诊断 pass(PR #8982);
- 0.56.0:新增
numba.set_parallel_chunksize/numba.get_parallel_chunksize(并支持 context manager 调整),numba.get_thread_id的线程 ID 定义变得可预测且在已知范围内,@stencil的串行/并行性能均有提升; - 0.53.0:支持 Fortran 序(F-order)数组;
- 0.40.0:并行循环允许数组作为归约变量;
- 0.38.0:修复
parallel=True相关 bug 使向量化机会增加。
配套的并行化实现与文档位于 numba/parfors/、docs/source/user/parallel.rst。调试环境变量NUMBA_DEBUG_ARRAY_OPT_STATS(0.36.1 起)可输出哪些算子/调用被转换为并行 for 循环。
七、CUDA 目标:从基础支持到完整扩展 API
CUDA 是 Numba 除 CPU 外的第二大目标,发布说明中几乎每版都有独立的 CUDA 板块。
0.57.0(CUDA 大版本)
- 工具链:支持CUDA 11.8 与 12,提供 11.x 的 Minor Version Compatibility(MVC);打包改用 NVIDIA 官方 CUDA Toolkit conda 包(PR #7255、#8180);
- 硬件:支持Hopper、Ada Lovelace、AGX Orin;
float16:算术运算完整支持,新增is_fp16_supported()方法与supports_float16设备属性(PR #7885、#8001、#8010、#8634);- 高层扩展 API 在 CUDA 目标完全可用;支持多签名急切编译、广义 ufunc 多输出与返回类型指定;kernel 内可调用有限集合的 NumPy ufunc(三角函数,PR #8294);
- 开启 lineinfo 不再改变生成代码(PR #8594);
- 修复 CUDA ufunc 中虚假的 device-to-host 传输(PR #9005)。
0.56.0 与 0.55.x
- 0.56.0:设备函数自递归、向量类型(
float4、int2等)、扩展类型共享/局部数组、链接 CUDA C/C++ 设备函数、CC 8.6/8.7 PTX 生成、float16比较运算;性能上消除 launch 配置时的 context 查询、launch 配置 LRU 缓存、kernel 磁盘缓存; - 0.55.x:支持 NVIDIA CUDA Python bindings、16 位浮点及基础运算 intrinsic、
Stream.async_done提供流对象;0.55.1 宣布弃用 CC < 5.3 与 CUDA Toolkit < 10.2(0.56 移除)。
更早的里程碑
- 0.54.0:
lineinfo输出(供 Nsight Compute 等使用)、Windows 上的 IPC、tuple 传入 CUDA ufunc、warp-aggregated intrinsics(activemask()、lanemask_lt())、@overload在 CUDA 目标支持; - 0.53.0:CUDA 11.2+(NVVM IR 1.6 / LLVM IR 7.0.1)、
cuda.is_supported_version()、CUDA Array Interface v3(含 streams)、Cooperative Groups(Grid Groups / Grid Sync)、tuple/namedtuple 传参;macOS 上的 CUDA 支持进入弃用状态; - 0.52.0:Unified Memory、kernel launch 开销降低、libdevice 全函数接入、更多原子操作;
- 0.33.0:基于 xoroshiro128+ 的 GPU 随机数生成器;
@cuda.jitkernel 可直接调用@jit/@njitCPU 函数并自动编译为设备函数。
相关代码位于 numba/cuda/,文档见 docs/source/cuda/。
八、弃用与破坏性变更时间线(升级必读)
发布说明中反复强调的一条主线是弃用策略。以下是文档明确记载的时间线:
- object mode 回退(fallback)弃用:0.57.0 起正式推进,并给出了具体时间表(PR #8702)——未来无关键字参数的
@jit将与@njit等同;建议从现在起显式使用@njit或@jit(nopython=True); @generated_jit弃用(0.57.0):numba.extending.overload是其超集替代品;numba.pyccpending deprecation(0.57.0);- CUDA 移除:0.53.0 移除
argtypes/restypes/bind关键字参数与Device.COMPUTE_CAPABILITY、to_host方法;0.56.0 移除 CC < 5.3 与 CTK < 10.2 支持、弃用inspect_ptx()(改用compile_ptx())与设备函数急切编译; target关键字弃用(0.51.0);jitclass从顶层命名空间迁至numba.experimental(0.49–0.52 完成 shim 移除);- ROCm 目标转为 unmaintained(0.54.0),单独迁出仓库;
- 兼容性(compatibility)模式移除(0.52.0),该模式源自 40 个版本前、用于 0.11→0.12 过渡;
- Python 2 / 3.5 支持终止(0.47.0 后)、内部模块重排的 shim 于 0.50.0 移除。
关于弃用细节的官方汇总见 docs/source/reference/deprecation.rst。
九、调试、缓存与工程质量
发布说明同样记录了大量「体验类」改进,值得使用者关注:
- 调试:0.31.0 起
debug=True生成 GDB 兼容调试信息;0.52.0 起函数名 mangling 与 Python 函数名完全一致(可对 Python 名直接打断点),并提供 GDB pretty-printing 支持模块;0.56.0 新增NUMBA_EXTEND_VARIABLE_LIFETIMES环境变量(将变量生命周期延伸到基本块末尾,模拟 C/C++/Fortran 调试体验)与_dbg_optnone装饰器参数(完全关闭 LLVM 优化 pass); - 缓存:0.22.0 起 JIT 缓存存储编译后的目标代码;0.45.0 起
parallel=True函数可缓存;0.51.0 起 objmode 块可缓存;0.56.0 起 CUDA kernel 支持磁盘缓存;0.51.0 起全部 pickle 操作改用 vendored cloudpickle(numba/cloudpickle/); - 可观测性:
numba -s系统信息工具(0.30.0)、chrome tracing 输出(0.56.0)、编译器事件系统(0.53.0)、inspect_llvm()/inspect_asm()/inspect_cfg(); - CI 与测试:0.41.0 起 Azure Pipelines、flake8 检查(0.41)、typeguard(0.53)、Python 3.11 矩阵(0.57)等。
十、版本速查表与升级建议
| 版本 | 发布时间 | 核心亮点 | 最低依赖 |
|---|---|---|---|
| 0.57.1 | 2023-06 | CUDA ufunc 修复、parfor 诊断调整、缓存修复 | Python 3.8+ / NumPy 1.21+ / LLVM 14 |
| 0.57.0 | 2023-05 | Python 3.11、NumPy 1.24、Generator 全面支持、CUDA 12/MVC、NRT 加固、objmode 弃用启动 | Python 3.8+ / NumPy 1.21+ / LLVM 14 |
| 0.56.4 | 2022-11 | CUDA.view()回归修复 | — |
| 0.56.0 | 2022-07 | 最后一个支持 Python 3.7 的版本、chunksize 控制、CUDA C/C++ 链接、磁盘缓存 | LLVM 11 |
| 0.55.0 | 2022-01 | Python 3.10、NumPy 1.21、isinstance、新错误处理模式 | LLVM 11 |
| 0.54.0 | 2021-08 | f-string、dict 推导式、@overload_classmethod、CUDA@overload | LLVM 11、Python 3.7+ |
| 0.53.0 | 2021-03 | Python 3.9、动态 gufunc、Cooperative Groups | LLVM 10 |
| 0.52.0 | 2020-11 | LLVM 级 refcount 剪枝、SLP 向量化、Unified Memory | LLVM 10 |
| 0.49.0 | 2020-04 | 移除 Python 2、SSA 化 IR、内部模块重组 | LLVM 9、Python 3.6+ |
| 0.34.0 | 2017 | ParallelAccelerator(parallel=True/prange)发布 | — |
| 0.12 | 2014 | 编译器大重构、njit诞生 | — |
给升级者的建议:若你仍在使用@jit无参形式或@generated_jit,应依据 0.57.0 的弃用声明尽早迁移到@njit与@numba.extending.overload;CUDA 用户需确认本机 CUDA Toolkit 版本(0.57 要求 11.8+ 以获得最佳支持,且支持 11.x MVC 与 CUDA 12);Python 3.8 是当前仓库(0.57 系)的最低 Python 基线。后续 0.58+ 版本的变更细节可在 docs/source/release/ 目录下按版本查阅 towncrier 生成的说明。
【免费下载链接】numbaNumPy aware dynamic Python compiler using LLVM项目地址: https://gitcode.com/gh_mirrors/nu/numba
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考