выделите не разрешающие типы в режиме nopython

#python #vectorization #jit #numba

Вопрос:

Я борюсь с ошибкой numba Untyped global name 'is_a_subset': Cannot determine Numba type of <class 'numba.np.ufunc.gufunc.GUFunc'> , Это обычно означает, что я ошибся и использовал метод, который не поддерживается numba. Следующий код завершается ошибкой.

 @guvectorize("(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
    out[:]=np.array([item in x for item in y])

@njit()
def test(x,y,z):
    is_a_subset(x,y,z)
    return z.mean()

x=np.array([[1,2,3],[3,2,1]])
y=np.array([[3,6,1],[1,2,3]])
z = np.empty_like(x)
test(x,y,z)
 

Однако удаление njit в тестовой функции заставляет все работать.

 def test(x,y,z):
    is_a_subset(x,y,z)
    return z.mean()
 

Почему numba пытается разрешить типы в режиме без python?
Я тоже пробовал, но без разных результатов

 @guvectorize(["f8[:],f8[:],f8[:]"],"(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
    out[:]=np.array([item in x for item in y])
 

Ответ №1:

Я использую Numba 0.53.1 и могу воспроизвести эту ошибку. В этом блоге об обновлении динамической отправки guvectorize в Numba 0.53 упоминается об этом в конце (курсив добавлен).:

В будущем мы хотели бы приблизить эти @guvectorize возможности к @vectorize тем, которые есть. Например, в настоящее время невозможно вызвать функцию guvectorize из функции jitted ( @jit ).

Существует аналогичная открытая проблема с vectorize , но она демонстрирует, что @vectorize функции могут вызываться в @jit функциях, просто это ограничено значением по умолчанию target = "cpu" .

Комментарии:

1. есть идеи, как векторизировать эту функцию?

2. Пока разработчики Numba не разберутся с этим (а это может занять некоторое время), я бы просто разработал небольшие @njit @vectorize функции или @guvectorize функции, которые вызываются в 1 обычной функции Python , которая действует как клей, точно так же, как ваша незакрашенная test . Когда вы помещаете все циклы и векторизацию в NumPy или Numba, в функции клея почти ничего не остается для оптимизации.