Случай, когда numba.jit никак не влияет на производительность - PullRequest
0 голосов
/ 30 ноября 2018

Я запускаю простые тесты, чтобы увидеть, насколько эффективен numba.jit для повышения скорости работы циклов с массивами numpy.Однако в обоих этих примерах:

def f():
    a=np.ones(1000)
    for i in range(100000):
        a+=np.random.normal(0,1,1000)
%time f()

и

from numba import jit

@jit
def g():
    a=np.ones(1000)
    for i in range(100000):
        a+=np.random.normal(0,1,1000)

%time g()

Я получаю:

  • Время ЦП: пользователь 3,75 с, sys: 0 нс, всего: 3,75 с Время ожидания: 3,75 с
  • Время ЦП: пользователь 3,86 с, sys: 4,11 мс, всего: 3,86 с Время перерыва: 3,84 с

Так что numba.jit не работаетПохоже, в этом случае никакого эффекта нет.Почему это?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Непонятно почему вы думаете, что должно быть улучшение.Я вижу улучшение, добавив внутренний цикл с numba, который может быть, потому что JIT-компиляция может оптимизировать операции с более базовыми типами более низкого уровня.

# python 3.6.0, numpy 1.11.3, numba 0.30.1

np.random.seed(0)

def f(m, n):
    a = np.ones(n)
    for i in range(m):
        a += np.random.normal(0,1,n)
    return a

@jit
def g(m, n):
    a = np.ones(n)
    for i in range(m):
        x = np.random.normal(0,1,n)
        for j in range(n):
            a[j] += x[j]
    return a

%timeit f(10**5, 10**3)  # 6.53 s per loop
%timeit g(10**5, 10**3)  # 4.68 s per loop
0 голосов
/ 30 ноября 2018

Как видно из документации, можно оптимизировать только операцию + =: https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html#numpy.random.normal

У вызова генератора случайных чисел есть size, поэтому он не покрывается.

Большую часть времени, вероятно, уже сделано numpy эффективным способом, в этом случае не так уж много можно оптимизировать с помощью numba.

...