Представления Numba
Я использую много Нумбы jit
декоратор и я недавно понимаю, что новые функции были добавлены в Numba, в частности, parallel
вариант и stencil
декоратор.
Трафарет очень хорош для создания более чистого кода, но после нескольких тестов кажется, что он просто красивый, а не эффективный. Вот пример кода:
@numba.njit
def nb_jit(A, out):
for i in range(1, A.shape[0]-1):
out[i] = 0.5*(A[i+1] - A[i-1])
return out
@numba.njit(numba.float64[:](numba.float64[:], numba.float64[:]))
def nb_jit_typed(A, out):
for i in range(1, A.shape[0]-1):
out[i] = 0.5*(A[i+1] - A[i-1])
return out
@numba.njit(parallel=True)
def nb_jit_paral(A, out):
for i in numba.prange(1, A.shape[0]-1):
out[i] = 0.5*(A[i+1] - A[i-1])
return out
@numba.stencil
def s2(A):
return 0.5*(A[1] - A[-1])
@numba.njit
def nb_stencil(A):
return s2(A)
@numba.njit(parallel=True)
def nb_stencil_paral(A):
return s2(A)
Я проверил эти функции со следующими массивами:
import numpy as np
arr = np.random.rand(100000)
res = arr.copy()
и это дает мне следующие времена выполнения (Конечно, я выполнил каждую функцию за один раз до времени!):
____________________________________________________
| %timeit nb_jit(arr, res) | 36 us |
| %timeit nb_jit_typed(arr, res) | 68 us |
| %timeit nb_jit_paral(arr, res) | 151 us |
| %timeit nb_stencil(arr) | 59 us |
| %timeit nb_stencil_paral(arr) | 241 us |
____________________________________________________
Так что мне было интересно:
- Зачем
nb_jit_typed
медленнее, чемnb_jit
? Насколько я помню, в прошлый раз я проверял это. - Зачем
nb_jit_parallel
так медленно? - Правильно ли я использовал трафарет? Я имею в виду, что использование трафарета таким образом приводит к потере производительности, так почему мы должны его использовать?
Замечания:
import numba
numba.__version__
'0.37.0'
import multiprocessing
multiprocessing.cpu_count()
4
Редактировать:
Синхронизация тех же функций более 10000 повторений с массивами измерений (1000000,) с помощью time.time() (без какого-либо графического интерфейса):
jit | 16.37 s
jit typed | 17.22 s
jit parallel | 18.45 s
stencil | 21.95 s
stencil paral | 24.48 s