В numba 0.46 декоратор numba.vectorize
без подписи создаст универсальную функцию dynamici c , что означает, что он компилирует код на основе типов при вызове. Таким образом, вам не нужно указывать подпись.
import numpy as np
import numba as nb
@nb.vectorize()
def nb_vec(x):
if x > 0:
x = x + 100
return x
>>> nb_vec
<numba._DUFunc 'nb_vec'>
>>> nb_vec.types
[]
>>> nb_vec(np.ones(5))
array([101., 101., 101., 101., 101.])
>>> nb_vec.types
['d->d']
Однако, если вы укажете target='parallel'
, это создаст обычную универсальную функцию. Таким образом, он поддерживает только предоставленные подписи. В вашем случае вы пропустили подписи, поэтому он фактически не поддерживает никаких входных данных.
import numpy as np
import numba as nb
@nb.vectorize(target='parallel')
def nb_vec(x):
if x > 0:
x = x + 100
return x
>>> nb_vec
<ufunc 'nb_vec'>
>>> nb_vec.types
[]
Решение здесь заключается в том, чтобы указать сигнатуру с соответствующими типами при использовании параллельной векторизации:
import numpy as np
import numba as nb
@nb.vectorize(
[nb.int32(nb.int32),
nb.int64(nb.int64),
nb.float32(nb.float32),
nb.float64(nb.float64)],
target='parallel')
def nb_vec(x):
if x > 0:
x = x + 100
return x