Почему печать один раз каждые 100 000 итераций ухудшает производительность Numba? - PullRequest
0 голосов
/ 06 декабря 2018

Почему этот код с print один раз каждые 100 000 итераций (т. Е. печатаются только 40 строк !) Занимает 50 секунд:

import numpy as np
from numba import jit

@jit
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 %.2f %% already done. " % (i, i * 100.0 / len(A)))

doit()

, тогда как безprint, это займет всего 2,4 секунды :

import numpy as np
from numba import jit
@jit
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])
doit()

?

Это общий факт, что print действительно можетубрать выгоду numba?

1 Ответ

0 голосов
/ 06 декабря 2018

Если вы попытаетесь скомпилировать его с @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

...