Странное поведение Numba 0.50 при использовании @jit - PullRequest
1 голос
/ 19 июня 2020

Следующая функция отлично работает с Numba 0.38:

@jit
def _ndiff(x):
    s = x.size
    r = np.empty(s, dtype=np.bool) 
    for i in range(1, s): 
        r[i] = x[i] - x[i-1] 
    return r

arr = np.array([True, True, True, False, False, False, False, True, True, True])

_ndiff(arr)

# > np.array([3, 7])

Однако при использовании Numba 0.50 она выдает некоторое количество ошибок:

./application.py:18: NumbaWarning: 
Compilation is falling back to object mode WITH looplifting enabled because Function "_ndiff" failed type inference due to: Unknown attribute 'type' of type array(bool, 1d, C)

File "application.py", line 23:
def _ndiff(x):
    <source elided>
    s = x.size
    r = np.empty(s, dtype=x.type) 
    ^

During: typing of get attribute at ./application.py (23)

File "application.py", line 23:
def _ndiff(x):
    <source elided>
    s = x.size
    r = np.empty(s, dtype=x.type) 
    ^

  @jit
./application.py:18: NumbaWarning: 
Compilation is falling back to object mode WITHOUT looplifting enabled because Function "_ndiff" failed type inference due to: cannot determine Numba type of <class 'numba.core.dispatcher.LiftedLoop'>

File "application.py", line 24:
def _ndiff(x):
    <source elided>
    r = np.empty(s, dtype=x.type) 
    for i in range(1, s): 
    ^

  @jit
/home/ubuntu/anaconda3/envs/py38/lib/python3.8/site-packages/numba/core/object_mode_passes.py:177: NumbaWarning: Function "_ndiff" was compiled in object mode without forceobj=True, but has lifted loops.

File "application.py", line 22:
def _ndiff(x):
    <source elided>
    s = x.size
    ^

  warnings.warn(errors.NumbaWarning(warn_msg,
/home/ubuntu/anaconda3/envs/py38/lib/python3.8/site-packages/numba/core/object_mode_passes.py:187: NumbaDeprecationWarning: 
Fall-back from the nopython compilation path to the object mode compilation path has been detected, this is deprecated behaviour.

For more information visit http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit

File "application.py", line 22:
def _ndiff(x):
    <source elided>
    s = x.size
    ^

В основном он много жалуется на возвращается в объектный режим, потому что ему не нравится почти все, что он здесь находит. Несмотря на эти предупреждения, тестирование функции @jit с массивом размером 1000000 дает абсолютную уверенность в том, что она абсолютно и определенно не работает в объектном режиме (несмотря на эти предупреждения, она выполняется за несколько микросекунд, в то время как чистая версия Python требует навсегда).

Есть ли что-то другое, связанное с этой версией Numba?

...