Следующая функция отлично работает с 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?