@njit проблемы с итеративным определением для функции min
Я пытаюсь определить функцию @njit, которая в нескольких точках должна вычислить минимум. Делать это следующим образом работает:
min(arg1, arg2,...)
Однако, когда я вычисляю минимум повторяемого элемента, у меня возникает проблема, независимо от того, как определяется этот повторяемый элемент. Я воспроизвел это с небольшой функцией ниже:
itrbl=[5.0, 0.4, 4.5, 3.5, 6.4]
@njit
def funct(itrbl):
return min(itrbl)
funct(itrbl)
и получите следующую ошибку:
TypingError: Invalid usage of Function(<built-in function min>) with parameters (reflected list(float64))
* parameterized
Кажется, мне не нравится, когда я структурирую itrbl как массив... Как мне нужно структурировать itrbl, чтобы эта простая функция работала?
0 ответов
В njit
Тед функции, вызовы функций заменяются версиями этих функций numba. Поэтому, когда вы звоните min
это не питоны min
функция.
Также Numba, как правило, оптимизирован для работы с numpy.array
не list
s. Когда вы проходите в list
нумбе njit
Тед функции (из Python) или вернуть list
из njit
Функция (в Python) должна преобразовывать (копировать) весь список в отраженный список или наоборот при возврате ( Почему передача списка (длиной n) в функцию numba nopython является операцией O(n)), Поэтому вам следует избегать передачи списков Python функциям numba или их возврата. Однако создание списка в функции numba и передача его другим функциям numba не страдает от этих издержек преобразования.
Но это немного помимо сути вопроса, касающегося list
а также min
в функции Нумба. Похоже, Numba-версия min
не поддерживает списки / массивы (но поддерживает кортежи).
Вы можете легко создать функцию Numba, которая поддерживает списки:
from numba import njit
@njit
def my_min(lst):
"Don't pass empty arrays/lists to this function!"
min_ = lst[0]
for item in lst:
if item < min_:
min_ = item
return min_
Который, кажется, работает:
from numba import njit
@njit
def funct(itrbl):
return my_min(itrbl)
>>> funct([5.0, 0.4, 4.5, 3.5, 6.4])
0.4
Однако лучшим подходом было бы использовать array
s в числовых функциях. Причина в том, что по моему опыту с numba вы часто сталкиваетесь с случаями, когда numba не поддерживает списки (например, с min
) или вызов метода в списках происходит сравнительно медленно. Кроме того, накладные расходы по передаче списков функциям numba или возвращению их из функций numba могут быть огромными (и неожиданными).