Numba выдает ошибку для NumPy

После просмотра выступление SciPy о Numba, насколько я понимаю, если это делается с помощью инструментов NumPy, это можно сделать с помощью Numba (с хорошим шансом ускорить его).

Однако, когда я экспериментировал с Numba-fing некоторым кодом, похоже, что простой JIT (1) не имеет проблем с пониманием списка, но (2) не может понять numpy.asarray().

Когда я бегу

import numba
@numba.jit
def squareTest(xlist):
    y = [x**2 for x in xlist]
    return y

работает нормально. Но когда я бегу

import numba
import numpy as np
@numba.jit
def squareTest(xlist):
    y = [x**2 for x in xlist]
    y1 = np.asarray(y)
    return y1

консоль IPython дает мне длинную трассировку, говорит, что произошла ошибка понижения, и заканчивается

def squareTest(xlist):
    y = [x**2 for x in xlist]`  
    ^

Я не знаю структуру модуля Numba, но самая последняя часть говорит мне, что когда он собирается впоследствии превратить созданный список в массив NumPy, у него возникают проблемы с пониманием списка.

Я проверил

@numba.jit
def squareTest(xlist):
    y = list(range(20))
    y1 = np.asarray(y)
    return y1

и он работал без проблем, поэтому похоже, что он может обрабатывать либо понимание списка, или np.asarray(), но не оба.

Мое первое предположение заключалось в том, что режим njit может обрабатывать все NumPy, а режим, который отключается путем добавления n к jit, обрабатывает понимание списка. Но нет, первый пример кода все еще работает, когда он изменен на njit.

В чем здесь проблема и как я могу использовать функции Numba-fy, которые включают выполнение операций с массивами NumPy для массивов, которые наиболее питонически созданы с помощью списков?


person Post169    schedule 26.06.2018    source источник
comment
Вдохновляющие ораторы великолепны, но если вам нужны реальные знания, начните с вопросов numpy+numba, которые показывают, что работает и когда. Схема: если для вашей задачи есть решение NumPy, используйте его; Держите Numba под рукой для итерационных вычислений, которые NumPy не может векторизовать.   -  person    schedule 27.06.2018
comment
См. здесь stackoverflow.com/questions/39379556/   -  person user85779    schedule 27.06.2018
comment
@user6655984 user6655984 Да, эту конкретную вещь можно было бы улучшить с помощью векторизации, но я использую ее как микроверсию чего-то еще, на чем я также хочу попробовать @jit. Так что дело не столько в оптимизации кода, сколько в том, чтобы заставить его работать.   -  person Post169    schedule 28.06.2018


Ответы (1)


Numba может иногда обрабатывать списки, но спикер в выступлении «Numba — скажите этим хулиганам C++, чтобы они заблудились», на которое вы ссылались, указал, что для того, чтобы он реализовал свой потенциал, вам нужно написать код, который вы JIT в непитоновской манере.

Весьма вероятно, что когда Numba выполняет JIT-компиляцию кода, он меняет порядок операций или даже комбинирует операции, так что даже если он может выполнять понимание списка в списке, а также может превращать список в массив NumPy, это не может сделать оба.

Вам нужно заменить команду понимания списка не-питоновской последовательностью команд, чтобы сделать то же самое.

person Post169    schedule 26.06.2018