@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не lists. Когда вы проходите в 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

Однако лучшим подходом было бы использовать arrays в числовых функциях. Причина в том, что по моему опыту с numba вы часто сталкиваетесь с случаями, когда numba не поддерживает списки (например, с min) или вызов метода в списках происходит сравнительно медленно. Кроме того, накладные расходы по передаче списков функциям numba или возвращению их из функций numba могут быть огромными (и неожиданными).

Другие вопросы по тегам