Представления 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

0 ответов

Другие вопросы по тегам