Numba - отличный инструмент для ускорения анализа массива numpy. Но я застрял с использованием доступа на основе индекса, который становится все труднее поддерживать, чем сложнее становится код. Я собираюсь ввести какой-то вид поиска, чтобы я мог указать хотя бы столбец «имя» для массива numpy. Любые предложения приветствуются. Для иллюстрации: моя лучшая идея до сих пор - простой дикт: the array:
@jit(nopython=True)
def numbaprocess(array,index):
if array[index,2]>0.3:
return 1
else:
return 0
### more processes with different columns, index, index-1 etc.
Вышеописанное работает просто отлично, но, как уже упоминалось, я должен отслеживать все столбцы по индексу, что подвержено ошибкам, и если я изменяю форму массива, мне нужно обновить код: Поэтому я попробовал это, но numba не принимает python dicts.
@jit(nopython=True)
def numbaprocess_readable(array,index,coldict):
if array[index,coldict['C']]>0.3:
return 1
else:
return 0
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
non-precise type pyobject
[1] During: typing of argument at <ipython-input-76-3dd8c7577317> (10)
File "<ipython-input-76-3dd8c7577317>", line 10:
def numbaprocess_readable(array,index,coldict):
if array[index,coldict['C']]>0.3:
^
This error may have been caused by the following argument(s):
- argument 2: cannot determine Numba type of <class 'dict'>
ПРИМЕЧАНИЕ: Я уже пробовал новые numba dicts, но они намного медленнее, чем python dicts. Я сэкономлю код, но для python dict требуется около 50 нс, чтобы вернуть против numba dict, занимающего 7 микросекунд. Мне нужно, чтобы этот простой процесс оставался ниже 1 микросекунды.
d = Dict.empty(
key_type=types.unicode_type,
value_type=types.uint,
)
# Fill the dictionary
d['AssetId'] =0
d['Open'] = 1
ОБНОВЛЕНИЕ: Тем временем я пробовал структурированные массивы, которые допускают имена столбцов - доступ в 13 раз медленнее, чем доступ с использованием чисто числовых массивов. Так что не лучший вариант
array[0]['colC'] ## in my dataset (5 million) 13 times slower than:
array[0,3]
Помимо этого неудачного подхода, существует ли эффективный способ ввода имен некоторых столбцов в функцию numba, которая работает с числовым массивом numpy?