版本 0.59.0 (2024年1月31日)
目录
这是 Numba 的一个主要版本。Numba 现在支持 Python 3.12,以下是所有值得关注的项目的摘要。
要点
支持 Python 3.12
此版本的突出功能是 Numba 正式支持 Python 3.12。
请注意,在此版本中(对于 Python 3.12)暂时禁用了性能分析支持,并且在开发过程中已发现了一些已知问题。Numba 团队正在积极解决这些问题。请参阅相应的问题页面(Numba #9289 和 Numba #9291),以获取正在进行的问题列表和进展更新。
(PR-#9246)
改进
NumPy 支持
添加了对 np.polynomial.polynomial.Polynomial
类的支持。
添加了对来自 np.polynomial.polynomial
包的 Polynomial 类的支持。
(PR-#9140)
CUDA API 变更
添加了对使用 C ABI 编译设备函数的支持
通过 compile_ptx()
API 添加了对使用 C ABI 编译设备函数的支持,以便于与 CUDA C/C++ 和其他语言进行互操作。
(PR-#9223)
Bug 修复
动态分配 Parfor 调度
此 PR 修复了并行区域在循环中多次执行的问题。之前的代码使用 alloca 在栈上分配 parfor 调度,但如果循环中有很多这样的 parfors,栈就会溢出。新代码在并行区域前后分别调用 Numba 并行运行时进行一对分配/释放操作。目前,这些调用重定向到 malloc/free,尽管其他机制如池化也是可能的,并可能在以后实现。此 PR 还会在 prange 循环未转换为 parfor 的情况下添加警告。如果循环中存在异常控制流,则可能会发生这种情况。这些问题相关,因为原始问题中的 prange 循环未转换为 parfor,因此 prange 主体内的所有 parfors 都在并行运行,并且每次都添加到栈中。
(PR-#9048)
numpy.digitize
实现行为与 numpy 对齐
更新了 numpy.digitize
的实现,使其在更广泛的情况下(包括提供的 bin 实际上不是单调的情况)与 numpy 的行为保持一致。
(PR-#9169)
numpy.searchsorted
和 numpy.sort
行为更新
numpy.searchsorted
实现已更新,以在更广泛的使用场景中(包括提供的数组 a 实际上未正确排序的情况)生成与 numpy 相同的输出。numpy.searchsorted
实现修复了side='right'
且提供的数组 a 包含 NaN 的情况下的 bug。numpy.searchsorted
实现已扩展以支持复数输入。numpy.sort
(和array.sort
)实现已扩展以支持复数数据的排序。
(PR-#9189)
修复 SSA 以考虑其使用未被定义支配的变量
修复了一个 SSA 问题,使得条件定义的变量将接收一个 phi 节点,表明存在变量未定义的路径。这会影响依赖 SSA 行为的扩展代码。
(PR-#9242)
修复 prange
中的 RecursionError
修复了使用 prange
的某些循环模式导致编译器中出现 RecursionError
的问题。此类循环的一个示例如下所示。该问题将导致编译器陷入无限递归循环,尝试确定 var1
和 var2
的定义。该模式涉及在 if-else 树中定义变量,并且并非所有分支都定义变量。
for i in prange(N):
for j in inner:
if cond1:
var1 = ...
elif cond2:
var1, var2 = ...
elif cond3:
pass
if cond4:
use(var1)
use(var2)
(PR-#9244)
变更
使测试列表不调用 CPU 编译。
Numba 的测试列表命令 python -m numba.runtests -l
历史上由于测试套件中某些测试函数的声明方式而触发 CPU 目标编译。现在已更改为在测试列表时不再调用 CPU 目标编译器,并添加了一个测试以确保这种情况保持不变。
(PR-#9309)
由于 Python 3.12 推导式中的变量遮蔽导致的语义差异
Python 3.12 引入了一个新的字节码 LOAD_FAST_AND_CLEAR
,它仅用于推导式。它具有 Numba 无法建模的动态语义。
例如,
def foo():
if False:
x = 1
[x for x in (1,)]
return x # This return uses undefined variable
在 return 语句处变量 x 是未定义的。Numba 不会引发 UnboundLocalError
,而是在编译时如果使用了未定义的变量则会引发 TypingError
。
但是,Numba 并非总能检测到未定义的变量。
例如,
def foo(a):
[x for x in (0,)]
if a:
x = 3 + a
x += 10
return x
调用 foo(0)
返回 10
而不是引发 UnboundLocalError
。这是因为 Numba 在运行时不跟踪变量的生命周期。返回值是 0 + 10
,因为 Numba 会将未定义的变量零初始化。
(PR-#9315)
重构并移除遗留 API/测试内部机制。
为了通过减少调用编译的方式来帮助日常维护,已移除了许多内部使用的函数,特别是
numba.core.compiler.compile_isolated
已移除。numba.tests.support.TestCase::run_nullary_func
已移除。numba.tests.support.CompilationCache
已移除。
此外,已从 numba.core.registry.CPUTarget
中移除了“嵌套上下文”的概念以及实现细节。目标扩展(那些使用 numba.core.target_extension
中的 API 将 Numba 支持扩展到自定义/合成硬件的扩展)的维护者应注意,如果自定义目标的 TargetDescriptor
中存在,也可以将其从目标扩展实现中删除。即,可以将 nested_context
方法和相关的实现细节从自定义目标的 TargetDescriptor
中直接删除。
此外,在重构过程中发现了一个关于记录数组类型化的 bug。结果表明,两个仅在可变性上不同的记录类型可能会别名,现在已修复此问题。
(PR-#9330)
弃用
显式设置 NUMBA_CAPTURED_ERRORS=old_style
将引发弃用警告
根据旧式错误捕获的弃用计划,显式设置 NUMBA_CAPTURED_ERRORS=old_style
将引发弃用警告。此版本是最后一个使用“old_style”作为默认值的版本。详细信息记录在 https://numba.readthedocs.cn/en/stable/reference/deprecation.html#deprecation-of-old-style-numba-captured-errors
(PR-#9346)
已过期的弃用
Pull 请求:
PR #9058: 修复具有多个输出的 gufunc (guilhermeleobas)
PR #9123: 实现大多数 ufunc 属性和 ufunc.reduce (guilhermeleobas)
PR #9126: 添加对 np.indices() 的支持 (KrisMinchev)
PR #9140: 添加对 Polynomial 类的支持 (KrisMinchev)
PR #9141: 添加对 np.polynomial.polyutils 中的 as_series() 以及 np.polynomial.polynomial 中的 polydiv()、polyint()、polyval() 的支持 (KrisMinchev)
PR #9144: 修复当字面量在 PHI 节点中错误传播时的错误 (guilhermeleobas)
PR #9154: 添加对 np.unwrap() 的支持 (KrisMinchev)
PR #9168: 修复 overload_method 模板中的 get_template_info 方法 (dlee992 sklam)
PR #9191: 添加 Numba 开机自检脚本并在 CI 中使用。 (stuartarchibald)
PR #9246: 支持 Python 3.12 (stuartarchibald kc611 esc)
PR #9249: 添加对检查 dtypes 相等的支持 (saulshanabrook)
PR #9296: 修复轴为负数时的 bug 并检查轴无效的情况 (guilhermeleobas)
PR #9309: 继续 #9044,防止在列出测试时在 CPU 目标上进行编译。 (stuartarchibald apmasell)
PR #9310: 移除 Python 3.8 支持。 (stuartarchibald)
PR #9330: 重构并移除遗留 API/测试内部机制。 (stuartarchibald)
PR #9331: 修复 3.12 引起的语法和弃用警告。 (stuartarchibald)
PR #9336: 将 TargetLibraryInfo 通道添加到 CPU LLVM 流水线。 (stuartarchibald)
PR #9337: 还原 #8583,该 PR 由于 M1 RuntimeDyLd Assertion 错误而跳过测试 (sklam)
PR #9346: 设置
NUMBA_CAPTURED_ERRORS=old_style
现在将引发警告。 (sklam)PR #9352: 从 @jit 中移除对象模式回退。 (stuartarchibald)
PR #9353: 移除 numba.generated_jit (stuartarchibald)
PR #9356: 重构打印测试以避免 NRT 内存泄漏问题。 (stuartarchibald)
PR #9357: 修复 _set_init_process_lock 警告中的拼写错误。 (stuartarchibald)
PR #9358: 移除关于 wheel 中 OpenMP 限制的备注。 (stuartarchibald)
PR #9359: 修复针对对象模式回退的 test_jit_module 测试。 (stuartarchibald)
PR #9402: 0.59 最终版的文档更新 (sklam stuartarchibald)
PR #9403: 修复测试套件中带状态配置的测试隔离问题 (sklam stuartarchibald)
PR #9404: 修复 Python 3.12.1 跳过测试 stderr 变更问题。 (stuartarchibald)