为什么我得到 '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)
而不是 ArgumentType
或 NoneType
。然后您可以测试参数是否使用 if yourArgument is None:
设置。我不知道 M1
和 [=18= 的类型是什么] 在你的代码中,但它们需要在带有可选参数的签名中明确定义。
我是 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)
而不是 ArgumentType
或 NoneType
。然后您可以测试参数是否使用 if yourArgument is None:
设置。我不知道 M1
和 [=18= 的类型是什么] 在你的代码中,但它们需要在带有可选参数的签名中明确定义。