版本 0.61.0 (2025年1月16日)

这是 Numba 的一个重要版本。Numba 现在支持 Python 3.13 以及 NumPy 2.1。最低支持的 Python 和 NumPy 版本已分别提高到 3.10 和 1.24。内置的 CUDA 目标 numba.cuda 现已弃用,从该版本开始,numba-cuda 是获取 CUDA 支持的首选位置。LLVM 15 现在通过 llmlite 0.44.0 作为默认 LLVM 版本得到支持。

请在下方找到所有值得注意的项目的摘要。

亮点

为新类型系统添加初始实现

这增加了一个新的类型系统,它将允许 Numba 区分 Python 和 NumPy 标量。

这已通过以下方式实现

  • 默认保留 Numba 的旧类型系统。

  • 添加配置标志 USE_LEGACY_TYPE_SYSTEM,默认设置为 1(开启)。将其切换到 0(关闭)将激活新类型系统。

  • 在新类型系统中,Python 和 NumPy 标量将通过 JIT 编译函数作为不同实体单独处理和返回。

(PR-#9662)

支持 Python 3.13

增加了对 Python 3.13 的支持。请注意,这不包括对自由线程的支持。

(PR-#9682)

停止支持 Python 3.9

此版本停止对 Python 3.9 的官方支持。Numba 现在支持 Python 3.10 及更高版本。

(PR-#9726)

将最低支持的 NumPy 版本更新到 1.24

此版本将 NumPy 的最低支持版本更新到 1.24。

(PR-#9739)

添加了对 NumPy 2.1 的支持

此版本添加了对 NumPy 2.1 的支持(不包括 NEP-050 语义)。

(PR-#9741)

新功能

通过 dask.distributed 调度 guvectorize 函数

使用 @guvectorize 装饰的函数现在可以在分布式 Dask 集群上进行调度。

(PR-#9495)

添加了编译时代码覆盖率

添加了发出编译时覆盖率数据的支持。此功能在 coverage 下运行 Python 时自动激活。它在编译器的降低阶段收集数据,显示编译成 LLVM-IR 的源代码行,不包括死代码消除的行。

(PR-#9508)

改进

一流函数改进

将 jit 函数作为参数传递给另一个接受其为 FunctionType 的 jit 函数,有两项新改进。

首先,编译器现在可以内联作为非局部变量(如全局变量)传递给另一个 jit 函数的 jit 函数。以前,解释器必须自省一流函数调用的函数地址,这阻止了内联。通过此改进,编译器可以静态确定引用的 jit 函数并链接相应的 LLVM 模块进行优化,完全绕过对 GIL 的需求。

其次,用作一流函数的 jit 函数现在可以引发异常。在此改进之前,它们与 @cfunc 装饰的函数受相同的限制,任何引发的异常都会被忽略。

(PR-#9077)

np.take 添加 axis 支持

np.take 中的 axis 关键字添加支持。

(PR-#9297)

允许缓存 Zip 文件中的 Numba 函数

此更改通过识别 Zip 文件并使用用户范围的缓存目录进行缓存,使从 Zip 存档中的文件导入的 Numba 函数能够被缓存。以前,Numba 会失败。

在上下文中,Zip 存档是分发 Python 包的一种受支持但不太常见的方式,并在 PySpark 中大量使用。

(PR-#9630)

优化时创建 Pass Manager 对象的方式改进

ModulePassManager 对象的创建移动到 _optimize_final_module 函数,防止将相同的 pass manager 对象用于编译多个 Python 函数。这将允许在优化不相关的模块以及可能在不同设置(向量化程度、优化级别等)下进行更好的控制。

(PR-#9670)

修复 typed.List __repr__() 以正确显示省略号

typed.List __repr__() 已修复为显示列表元素时不附加省略号,最多可显示 1000 个元素。以前,无论列表中元素的数量如何,列表的 repr 都会在列表末尾附加省略号。

(PR-#9693)

改进了死分支剪枝的使用

死分支剪枝的使用得到了改进,以支持谓词表达式依赖于后来改变类型的变量的情况。

(PR-#9711)

find_topo_sort 可靠性改进

通过用迭代遍历替换递归后序遍历,提高了 find_topo_sort 函数在复杂 CFG(通常通过生成代码)中的可靠性。这消除了达到 Python 递归限制的风险。

(PR-#9718)

NumPy 支持

添加了对 np.setdiff1d()np.setxor1d()np.in1d() 函数的支持,以及 np.intersect1d() 中的 assume_unique 参数

添加了对以下函数的支持:numpy.setdiff1d()np.setxor1d()np.in1d()np.isin();以及 np.intersect1d() 中的参数 assume_unique。对于 np.in1d()np.isin(),不支持关键字 kind,其行为与 NumPy 1.24 版本之前的行为一致。这等同于在 NumPy 1.24 及更高版本中设置 kind="sort"

(PR-#9338)

支持 np.trapezoid

添加对 NumPy 2.0 新函数 numpy.trapezoid 的支持。

(PR-#9719)

错误修复

memcpy 静态缓冲区内容复制到新分配的缓冲区中

修复了一个错误,即用于存储类型代码表示的静态缓冲区未作为 realloc 操作的一部分复制到新分配的缓冲区。

(PR-#9119)

修复 parfor 提升

以正确的顺序遍历块,以便 getattrs 在调用之前,从而可以将 getattr 的对象标记为多重定义。

(PR-#9397)

修复 ParallelAccelerator 提升逻辑错误

修复了 ParallelAccelerator 提升逻辑中的一个错误。该错误导致依赖于不可提升操作的操作无效提升,从而导致执行不正确。通过此修复,提升逻辑现在可以正确识别和处理对不可提升操作的依赖,确保操作正确提升和执行。

(PR-#9586)

修复调用 numpy.random 分布时 size=() 的问题

现在支持调用任何 numpy.random 分布时使用 size=();以前它会引发 TypingError,尽管 NumPy 支持它。

(PR-#9636)

修复 numpy.sum 在布尔数组上返回类型不正确的问题

在布尔数组上调用 numpy.sum 并使用 axis 参数时,错误地返回了 bool 类型,而它应该返回 int 类型。因此,在布尔数组上调用 numpy.count_nonzero 也错误地返回了 bool 类型。现在此问题已修复。

(PR-#9705)

修复了 numpy.random.Generator.binomial 中的数值错误和无限循环错误

修复了一个影响数值结果正确性的错误,以及一个在特定情况下(最容易由上述正确性错误触发)导致执行无限循环的问题。

(PR-#9747)

修复 Numba 0.60.0 对象模式回退因标签重命名错误导致的回归

修复了 Numba 0.60 中引入的对象模式回退中的一个回归。该问题与“标签重命名”代码直接修改 IR 而不是构造新的终止节点有关,这些修改会影响对象模式回退中存在的 IR 副本。

(PR-#9755)

修复 numpy.random.Generator 实例解封中的 Python 引用泄露问题

修复了 numpy.random.Generator 实例解封中的一些 Python 引用泄露。请注意,实际上是引用的 numpy.random.BitGenerator 在解封时发生泄露,但很少将这些对象本身用作参数。

(PR-#9756)

修复调度器在非可指纹类型中内存使用过多/内存行为不佳的问题

在对不可指纹类型进行重复调度的情况下,调度器现在使用的内存量与所见的唯一类型数量成比例,而不是与总类型数量成比例。

(PR-#9757)

修复 SSA 形式 IR 分支剪枝中的错误编译

修复了在 SSA 形式 IR 中,当带有常量参数的二元操作表达式用作谓词时发生的错误编译。

(PR-#9758)

修复星参数类型推断中的回归

修复了 0.59.0 和 0.60.0 版本之间发生的与星参数相关的类型推断回归。回归的原因是类型推断中星参数处理的代码在默认切换到使用新式错误处理后未更新。

(PR-#9799)

使 Numba 在“new_style”错误处理下内部合规

Numba 现在默认使用 new_style 错误处理,没有其他替代方案。Numba 的内部代码现在符合此错误处理样式,以便继续允许扩展编写者添加“重载”的进一步实现,而不会使编译器遇到“硬错误”。

(PR-#9837)

修复 Python 3.13.1 推导式字节码更改

Python 3.13.1 在推导式处理中引入了一个额外的 GET_ITER 字节码。此更改破坏了 Numba 的推导式支持。此补丁添加了忽略新 GET_ITER 字节码的逻辑以保持兼容性。

(PR-#9837)

更改

添加 NUMBA_JIT_COVERAGE 以控制覆盖率支持

新的 NUMBA_JIT_COVERAGE 环境变量可启用或禁用覆盖率支持。覆盖率默认禁用。

(PR-#9887)

移除了实验性 RVSDG 前端

实验性 RVSDG 前端已从 Numba 主代码库中移除。这一战略性决定允许将 RVSDG 前端作为一个可重用组件进行更专注和独立的开发。未来的开发和更新将在 https://github.com/numba/numba-rvsdg 和其他新开发的存储库中提供。

(PR-#9738)

POWER 支持更新

Numba 维护者已有一段时间未积极测试或构建 POWER 架构的软件包。代码将保留以确保与可能仍支持 Power8 的 Linux 发行版兼容,但 POWER 支持现已降级为非官方状态。

(PR-#9763)

默认禁用 sys.monitoring 支持

由于与原生代码的兼容性问题,sys.monitoring 支持默认禁用。在 Python 3.12 中,其实现和文档缺乏对原生代码支持的清晰说明,导致工具对 Python 帧和代码对象做出不正确假设。虽然 Python 3.13 改进了这种情况,但许多工具尚未适应这些更改。因此,在监视 Numba 编译的函数时,工具可能会崩溃。为解决此问题,Numba 默认禁用 sys.monitoring。用户可以通过设置环境变量 NUMBA_ENABLE_SYS_MONITORING 来选择启用。

(PR-#9780)

弃用

内置 CUDA 目标弃用

Numba 内置的 CUDA 目标(在 numba.cuda 下)已弃用,以支持 NVIDIA numba-cuda 包的进一步开发。numba-cudanumba.cuda 之间保持向后兼容性,无需更改用户代码。

(PR-#9768)

移除 NUMBA_CAPTURED_ERRORS

根据弃用计划,NUMBA_CAPTURED_ERRORS 环境变量和 CAPTURED_ERRORS 配置变量已移除。

(PR-#9773)

拉取请求:

  • PR #9076: 为切片错误添加形状上下文 (kklocker guilhermeleobas)

  • PR #9077: 当一流函数被静态确定为调度器时,启用其内联 (sklam)

  • PR #9119: 将 memcpy 静态缓冲区内容复制到新分配的缓冲区 (guilhermeleobas)

  • PR #9295: 改进可重排序 ufunc 支持 (guilhermeleobas)

  • PR #9297: 为 np.take 添加轴支持 (guilhermeleobas)

  • PR #9338: 添加 np.in1d, np.isin, np.setxor1d, np.setdiff1d, 扩展 np.intersect1d. (synapticarbors jaredjeya)

  • PR #9397: 重新排序块遍历顺序以实现正确提升。 (DrTodd13)

  • PR #9495: 通过 dask.distributed 调度 guvectorize 函数 (crusaderky)

  • PR #9508: 为编译代码添加编译时覆盖率 (sklam)

  • PR #9543: 防止在 Flags 中设置未声明的属性。 (sklam)

  • PR #9575: 初始化 0.61.0dev0:将 llvmlite 提升到下一个开发版本 (esc)

  • PR #9583: 从类型上下文(typing context)中移除 resolve_argument_type() (gmarkall)

  • PR #9593: 明确说明不支持 del (gmarkall)

  • PR #9600: 更新 0.60.0rc1 后的发布清单 (esc)

  • PR #9613: 将一些 CUDA 特定项移入 CUDA 目标 (gmarkall)

  • PR #9614: 反向移植 #9596 到主分支 (gmarkall kc611)

  • PR #9617: Cherry-Pick: 合并来自 esc/fix_parfors_test_sigabrt 的拉取请求 #9568 (esc)

  • PR #9619: 从清单中移除 rc1 后缀 (esc)

  • PR #9621: 杂项/0.60.0 主分支的更新日志 (esc)

  • PR #9629: 将 CUDA 目标实现添加到 sysinfo 和模块 (gmarkall)

  • PR #9630: 允许缓存 zip 文件中的 Numba 函数 (max-sixty)

  • PR #9631: 将 Azure 移至使用 macos-12 (gmarkall)

  • PR #9636: 修复 #8975:调用任何 np.random 分布时 size 为空元组引发 TypingError (NSchiffmacher)

  • PR #9643: 修复某些 PyTuple API 的 pythonapi 包装器 (sklam)

  • PR #9662: 类型系统实现 #1:添加了使用冗余的新类型系统的初始实现。 (kc611)

  • PR #9663: LLVM 15 的修复 (gmarkall)

  • PR #9666: 标签更改时触发 towncrier 工作流 (sklam)

  • PR #9670: 将 mpm 的创建移至 optimize_final_module (yashssh)

  • PR #9675: 修复 RTD 上的编译器错误 (sklam)

  • PR #9682: Python 3.13 支持 (sklam)

  • PR #9683: 修复 C99 I 不适用于 NumPy 2.0.1 的问题 (sklam)

  • PR #9686: 类型系统实现 #1:添加了使用冗余的新类型系统的初始实现。 (kc611)

  • PR #9691: 修复 #9678。build_map 的 parfor 问题 (sklam)

  • PR #9693: 修复 #9677。修复 ipython 环境中的列表 repr (kc611 alok-m)

  • PR #9701: 更新 pre-commit 配置中的 flake8 版本 (esc)

  • PR #9705: 修复 sum_expand 返回类型在布尔数组中缺少转换为整数的问题 (luyiming)

  • PR #9709: 激活 linux-aarch64 的编译器 (esc)

  • PR #9711: 在 SSA pass 之后添加死分支剪枝 pass (sklam)

  • PR #9715: 在日志记录中用 _lazy_pformat 替换 pprint.pformat 的使用 (srilman)

  • PR #9718: 用迭代实现替换 find_topo_order (njriasan)

  • PR #9719: 添加支持的 np.trapezoid (holymonson)

  • PR #9726: 移除 Python 3.9 支持 (kc611)

  • PR #9727: 回滚可能导致与 multiprocessing.Pool 错误相关的 buildfarm 问题的 Junit XML PR (sklam)

  • PR #9738: 回滚 RVSDG 前端。 (sklam)

  • PR #9739: 将最低支持的 NumPy 更新到 1.24 (kc611)

  • PR #9741: 添加对 NumPy 2.1 的支持 (kc611)

  • PR #9743: 修复 towncrier 脚本中的 GHA 版本 (kc611)

  • PR #9746: 将 Azure 移至使用 macos-13 (gmarkall)

  • PR #9747: 修复 Generator.binomial() 中的两个错误。 (stuartarchibald)

  • PR #9755: 修复标签重命名中 IR 突变的问题。 (stuartarchibald)

  • PR #9756: 修复 np.random.Generator 解包中的 PyRef 泄露 (stuartarchibald)

  • PR #9757: 修复一些内存泄露/不良内存行为 (stuartarchibald)

  • PR #9758: 修复 SSA 形式 IR 分支剪枝中的错误编译。 (stuartarchibald)

  • PR #9761: 为 py313 添加 CI (sklam)

  • PR #9763: 更新关于 power8 支持的文档。 (sklam)

  • PR #9768: 内置 CUDA 目标弃用 (gmarkall)

  • PR #9772: 当 gitlog2changelog 中检测到缺失作者时发出警告 (kc611)

  • PR #9773: 移除 0.61 的旧式捕获错误 (gmarkall)

  • PR #9774: 在 gpuCI 上使用支持的 NumPy 和 Python 版本进行测试 (gmarkall)

  • PR #9780: 默认关闭 sys.monitoring (sklam)

  • PR #9799: 修复针对 0.60 的异常处理中的回归。 (stuartarchibald)

  • PR #9821: 添加调试打印以调试 test_monitoring_multiple_threads 在 win-02 上失败的问题 (sklam)

  • PR #9837: 用 NumbaErrors 替换“硬错误”。 (stuartarchibald lericson for #9816)

  • PR #9887: 添加环境变量 NUMBA_JIT_COVERAGE 以禁用覆盖率 (sklam)