为什么我得到 'isinstance':无法确定 Numba 类型?

Why am I getting 'isinstance': Cannot determine Numba type?

我是 Numba 的新手。我正在尝试加速一个非常复杂的求解器。但是,我不断收到诸如

之类的错误

numba.core.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend) Untyped global name 'isinstance': Cannot determine Numba type of <class 'builtin_function_or_method'>

我写了一个小例子来重现同样的错误:

import numba
import numpy as np
from numba import types
from numpy import zeros_like, isfinite
from numpy.linalg import solve
from numpy.random import uniform


@numba.njit(parallel=True)
def foo(A_, b_, M1=None, M2=None):
    x_ = zeros_like(b_)
    r = b_ - A_.dot(x_)
    flag = 1

    if isinstance(M1, types.NoneType):           # Error here
        y = r
    else:
        y = solve(M1, r)
        if not isfinite(y).any():
            flag = 2

    if isinstance(M2, types.NoneType):
        z = y
    else:
        z = solve(M2, y)
        if not isfinite(z).any():
            flag = 2

    return z, flag


N = 10

tmp = np.random.rand(N, N)
A = np.dot(tmp, tmp.T)

x = np.zeros((N, 1), dtype=np.float64)
b = np.vstack([uniform(0.0, 1.0) for i in range(N)])

X_1, info = foo(A, b)

此外,如果我将装饰器更改为 generated_jit(),我会收到以下错误:

r = b_ - A_.dot(x_)
AttributeError: 'Array' object has no attribute 'dot'

Numba 编译 函数并要求每个变量都是静态类型。这意味着每个变量只有一种唯一类型:一个变量不能同时是 NoneType 类型和其他类型,这与基于动态类型的 CPython 不同。动态类型也是 CPython 运行缓慢的一个主要原因。因此,在 nopython JITed Numba 函数中使用 isinstance 没有多大意义。其实这个built-in功能是不支持的

也就是说,Numba 通过 在签名 中指定 optional(ArgumentType) 来支持 optional arguments(请注意,变量的结果类型是 optional(ArgumentType) 而不是 ArgumentTypeNoneType。然后您可以测试参数是否使用 if yourArgument is None: 设置。我不知道 M1 和 [=18= 的类型是什么] 在你的代码中,但它们需要在带有可选参数的签名中明确定义。