Протокол подписей Numba - PullRequest
0 голосов
/ 28 июня 2018

Несмотря на поиск в Stack Overflow и в Интернете в целом, а также на чтение нескольких вопросов Stack Overflow и numba.pydata.org страниц, а также на изучение некоторых подсказок, как сообщить Numba, какие типы я хочу дать и из функций я не нахожу реальной логики того, как это работает.

Например, я экспериментировал с функцией, которая обрабатывает список целых чисел и выдает еще один список целых чисел, и, пока работает декоратор @numba.jit(numba.int64[:](numba.int64[:])), декораторы @numba.njit(numba.int64[:](numba.int64[:])) и @numba.vectorize(numba.int64[:](numba.int64[:])) не работают.

(njit успешно прошел мимо декоратора и наткнулся на саму функцию; я предполагаю, что объединение элементов в список не является доступной функцией в режиме 'no python'. vectorize, однако, жалуется на сигнатуру , TypeError: 'Signature' object is not iterable; возможно, беспокоит то, что одномерный массив может содержать один элемент без скобок, что не является итеративным?)

Есть ли простой способ понять, как работает Numba на достаточной глубине, чтобы предвидеть, как я должен выразить подпись?

1 Ответ

0 голосов
/ 28 июня 2018

Самый простой ответ для jitnjit, который является справедливым и псевдонимом для nopython=True) - попытаться вообще избежать написания подписей - в типичных случаях вывод типа приведет вас туда.

Специфично для вашего вопроса numba.int64[:](numba.int64[:]) является действительной подписью и работает для jit.

numba.vectorize - ожидает повторяющиеся подписи (сообщение об ошибке), поэтому ваши подписи должны быть включены в список. Кроме того, vectorize создает непонятный ufunc, который определяется скалярными операциями (которые затем транслируются), поэтому ваша подпись должна быть скалярного типа. Э.Г.

@numba.vectorize([numba.int64(numba.int64)])
def add_one(v):
    return v + 1

add_one(np.array([4, 5, 6], dtype=np.int64))
# Out[117]: array([5, 6, 7], dtype=int64)
...