Я пытаюсь отсортировать список с помощью настраиваемого ключа в функции numba-jit в Python. Простые настраиваемые ключи работают, например, я знаю, что могу просто отсортировать по абсолютному значению, используя что-то вроде этого:
import numba
@numba.jit(nopython=True)
def myfunc():
mylist = [-4, 6, 2, 0, -1]
mylist.sort(key=lambda x: abs(x))
return mylist # [0, -1, 2, -4, 6]
Однако в следующем более сложном примере я получаю непонятную ошибку.
import numba
import numpy as np
@numba.jit(nopython=True)
def dist_from_mean(val, mu):
return abs(val - mu)
@numba.jit(nopython=True)
def func():
l = [1,7,3,9,10,-4,-2,0]
avg_val = np.array(l).mean()
l.sort(key=lambda x: dist_from_mean(x, mu=avg_val))
return l
Ошибка, о которой он сообщает, следующая:
Traceback (most recent call last):
File "testitout.py", line 18, in <module>
ret = func()
File "/.../python3.6/site-packages/numba/core/dispatcher.py", line 415, in _compile_for_args
error_rewrite(e, 'typing')
File "/.../python3.6/site-packages/numba/core/dispatcher.py", line 358, in error_rewrite
reraise(type(e), e, None)
File "/.../python3.6/site-packages/numba/core/utils.py", line 80, in reraise
raise value.with_traceback(tb)
numba.core.errors.TypingError: Failed in nopython mode pipeline (step: convert make_function into JIT functions)
Cannot capture the non-constant value associated with variable 'avg_val' in a function that will escape.
File "testitout.py", line 14:
def func():
<source elided>
l.sort(key=lambda x: dist_from_mean(x, mu=avg_val))
^
Вы знаете, что здесь происходит?