Если вы попытаетесь скомпилировать его с @njit
или @jit(nopython=True)
, вы увидите, что он компилируется в объектном режиме из исключения.Эта версия запускается на моем компьютере примерно за 1 секунду с инструкцией print:
import numpy as np
from numba import jit
@jit(nopython=True)
def doit():
A = np.random.random(4*1000*1000)
n = 300
Q = np.zeros(len(A)-n)
for i in range(len(Q)):
Q[i] = np.sum(A[i:i+n] <= A[i+n])
if i % 100000 == 0: # print the progress once every 100k iterations
print(i , "(", i * 100.0 / len(A), '% already done)')
В общем, если вы видите низкую производительность в функции numba, это происходит потому, что вы компилируете в режиме объектов Python, поэтому всегдаустановка nopython=True
является хорошей практикой, если вы действительно не хотите использовать ее в объектном режиме python, потому что она вернется к этому, если столкнется с некоторым синтаксисом, который компилятор не сможет скомпилировать в машинный код.Numba делает некоторые подъемы петли, но с точки зрения производительности сложнее рассуждать.
См .:
http://numba.pydata.org/numba-doc/latest/user/5minguide.html#what-is-nopython-mode