Ваша индексация с использованием numpy
:
In [181]: a, b = np.array([1,2,3]), np.array([5,6,7,8,9,10])
In [182]: b[a]
Out[182]: array([6, 7, 8])
In [183]: def foo(arr, eva):
...: return eva[arr]
...:
In [184]: foo(a,b)
Out[184]: array([6, 7, 8])
In [186]: timeit foo(a,b)
350 ns ± 9.98 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Попытка воспроизвести его (и, возможно, ускорить) с помощью numba
:
In [185]: import numba
In [187]: @numba.njit
...: def foo1(arr,eva):
...: return eva[arr]
...:
In [188]: foo1(a,b)
Out[188]: array([6, 7, 8])
In [189]: timeit foo1(a,b)
968 ns ± 19.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [190]: @numba.njit
...: def foo2(arr,eva):
...: res = np.empty(len(arr), eva.dtype)
...: for i in range(len(arr)):
...: res[i] = b[a[i]]
...: return res
In [191]: foo2(a,b)
Out[191]: array([6, 7, 8])
In [192]: timeit foo2(a,b)
941 ns ± 7.91 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [193]: @numba.njit
...: def foo2(arr,eva):
...: res = np.empty(len(arr), eva.dtype)
...: for i,v in enumerate(a):
...: res[i] = b[v]
...: return res
In [194]: foo2(a,b)
Out[194]: array([6, 7, 8])
In [195]: timeit foo2(a,b)
941 ns ± 17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Не много смысла пытаться заменить базовую c numpy
функциональность на numba
.
Кто-то с большим опытом numba
может улучшить это.
edit
Как я изначально заметил, numba
не любит индексировать со списком. Преобразование списка в массив работает:
In [196]: @numba.njit
...: def prueba(arr, eva):
...: mask = []
...: for i in range(len(arr)):
...: mask.append(arr[i])
...: mask = np.array(mask)
...: return eva[mask]
...:
In [197]: prueba(a,b)
Out[197]: array([6, 7, 8])
In [198]: timeit prueba(a,b)
1.5 µs ± 4.79 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)