2017-02-10 32 views
2

Я пытаюсь сравнить numba и чистый python с использованием базового примера, и я получаю нечетные результаты.Основной пример Numba медленнее, чем чистый python

Это пример Numba:

from numba import jit 
from numpy import arange 
from time import time 
# jit decorator tells Numba to compile this function. 
# The argument types will be inferred by Numba when function is called. 
@jit 
def sum2d(arr): 
    M, N = arr.shape 
    result = 0.0 
    for i in range(M): 
     for j in range(N): 
      result += arr[i,j] 
    return result 

a = arange(9).reshape(3,3) 
t = time() 
print(sum2d(a)) 
print time() - t 

Это время я получаю с Numba 0.0469660758972 секунд

И без Numba я получаю быстрый результат 9.60826873779e-05 секунд

+0

Это очень маленький пример. Как вы его приурочили? –

+0

@terencehill Спасибо за быстрый ответ. Я отредактировал свое оригинальное сообщение – msgb

+1

Возможно, вы потратили большую часть времени на компиляцию – user357269

ответ

3

необходимо скомпилировать вашу функцию на основе типов аргументов, вы можете либо сделать это при определении функции, указав подпись (eager compilation), либо вы можете позволить numba вывести типы для вас, когда вы вызываете (он называется компиляцией Just-in-time [JIT] в конце концов :-)).

Вы не указали какую-либо подпись, чтобы она выписала и скомпилировала функцию при ее первом вызове. Они even state that в примере, который вы использовали:

# jit decorator tells Numba to compile this function. 
# The argument types will be inferred by Numba when function is called. 

Однако последующие пробеги (с теми же типами и dtypes) будет быстро:

t = time() 
print(sum2d(a)) # 0.035051584243774414 
print(time() - t) 

%timeit sum2d(a) # 1000000 loops, best of 3: 1.57 µs per loop 

Последняя команда используется IPythons%timeit command.

+0

TLDR; предостережение заключается в использовании волшебной ячейки '%% timeit', которая снова запустит ячейку и сделает numba выводом типа при каждом отдельном вызове. Использование магической ячейки строки '% timeit' с предварительным вызовом функции лучше – MCMZL