版本 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 版本得到支持。
请在下方找到所有值得注意的项目的摘要。
亮点
改进
一流函数改进
将 jit 函数作为参数传递给另一个接受其为 FunctionType
的 jit 函数,有两项新改进。
首先,编译器现在可以内联作为非局部变量(如全局变量)传递给另一个 jit 函数的 jit 函数。以前,解释器必须自省一流函数调用的函数地址,这阻止了内联。通过此改进,编译器可以静态确定引用的 jit 函数并链接相应的 LLVM 模块进行优化,完全绕过对 GIL 的需求。
其次,用作一流函数的 jit 函数现在可以引发异常。在此改进之前,它们与 @cfunc
装饰的函数受相同的限制,任何引发的异常都会被忽略。
(PR-#9077)
允许缓存 Zip 文件中的 Numba 函数
此更改通过识别 Zip 文件并使用用户范围的缓存目录进行缓存,使从 Zip 存档中的文件导入的 Numba 函数能够被缓存。以前,Numba 会失败。
在上下文中,Zip 存档是分发 Python 包的一种受支持但不太常见的方式,并在 PySpark 中大量使用。
(PR-#9630)
优化时创建 Pass Manager 对象的方式改进
将 ModulePassManager
对象的创建移动到 _optimize_final_module
函数,防止将相同的 pass manager 对象用于编译多个 Python 函数。这将允许在优化不相关的模块以及可能在不同设置(向量化程度、优化级别等)下进行更好的控制。
(PR-#9670)
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)
错误修复
修复 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)
修复星参数类型推断中的回归
修复了 0.59.0 和 0.60.0 版本之间发生的与星参数相关的类型推断回归。回归的原因是类型推断中星参数处理的代码在默认切换到使用新式错误处理后未更新。
(PR-#9799)
更改
移除了实验性 RVSDG 前端
实验性 RVSDG 前端已从 Numba 主代码库中移除。这一战略性决定允许将 RVSDG 前端作为一个可重用组件进行更专注和独立的开发。未来的开发和更新将在 https://github.com/numba/numba-rvsdg 和其他新开发的存储库中提供。
(PR-#9738)
弃用
拉取请求:
PR #9076: 为切片错误添加形状上下文 (kklocker guilhermeleobas)
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 #9495: 通过 dask.distributed 调度 guvectorize 函数 (crusaderky)
PR #9583: 从类型上下文(typing context)中移除 resolve_argument_type() (gmarkall)
PR #9617: Cherry-Pick: 合并来自 esc/fix_parfors_test_sigabrt 的拉取请求 #9568 (esc)
PR #9636: 修复 #8975:调用任何 np.random 分布时 size 为空元组引发 TypingError (NSchiffmacher)
PR #9715: 在日志记录中用 _lazy_pformat 替换 pprint.pformat 的使用 (srilman)
PR #9719: 添加支持的 np.trapezoid (holymonson)
PR #9727: 回滚可能导致与 multiprocessing.Pool 错误相关的 buildfarm 问题的 Junit XML PR (sklam)
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 #9799: 修复针对 0.60 的异常处理中的回归。 (stuartarchibald)
PR #9821: 添加调试打印以调试 test_monitoring_multiple_threads 在 win-02 上失败的问题 (sklam)
PR #9837: 用 NumbaErrors 替换“硬错误”。 (stuartarchibald lericson for #9816)