Компиляция abs () в numba медленнее обычной функции python - PullRequest
0 голосов
/ 02 сентября 2018

Это все было запрограммировано в ноутбуке jupyter, однако я не нашел других результатов в «обычном» терминале / свободном рабочем пространстве. Я обнаружил, что работает эта функция:

def __difference(a,b):
    return abs(a,b)

Постоянно быстрее, чем:

@jit(nopython=True)
def __difference_numba(a,b):
    return abs(a,b)

Функция скомпилирована, и это вывод __difference_numba.inspect_types () (мои входные данные - два числа с плавающей запятой в обоих случаях):

__difference_numba (float64, float64)
--------------------------------------------------------------------------------
# File: <ipython-input-50-f6f52d4cccbf>
# --- LINE 1 --- 
# label 0

@jit(nopython=True)

# --- LINE 2 --- 

def __difference_numba(a, b):

# --- LINE 3 --- 
#   a = arg(0, name=a)  :: float64
#   b = arg(1, name=b)  :: float64
#   $0.1 = global(abs: <built-in function abs>)  :: Function(<built-in function abs>)
#   $0.4 = a - b  :: float64
#   del b
#   del a
#   $0.5 = call $0.1($0.4, kws=[], vararg=None, args=[Var($0.4, <ipython-input-50-f6f52d4cccbf> (3))], func=$0.1)  :: (float64,) -> float64
#   del $0.4
#   del $0.1
#   $0.6 = cast(value=$0.5)  :: float64
#   del $0.5
#   return $0.6

return abs(a-b)#np.abs(a - b)

=============================================================================

Код с использованием функции timeit to time:

Параметры определения ячейки (я пробовал разные числа):

#test parameters
a=5.0
b=-2.5

Ячейка для тестирования реализации и результатов numba:

%%timeit
#test numba

__difference_numba(a,b)

239 ns ± 6.03 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Ячейка для тестирования нормальной реализации на python и результаты:

%%timeit
#test python

__difference(a,b)

156 ns ± 0.823 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

1 Ответ

0 голосов
/ 03 сентября 2018

Я полагаю, что то, что вы видите, - это накладные расходы на отправку кода numba (а не обязательно скорость скомпилированной функции abs), поскольку работа, выполняемая в функции, является тривиальной.

Обычно вы не разделяете тривиальный вызов, подобный этому, на функцию, хотя вызов _difference_numba из другой функции, объединенной с помощью numba, может быть встроен компилятором. В любом случае, вам нужно оставаться в коде numba дольше, чем накладные расходы, чтобы начать видеть различия в производительности между чистым кодом Python и кодом с numba-jlit. Перезвонить туда-сюда через границу numba / python, как это, не преодолеет накладные расходы.

...