Производительность вложенной функции Numba - PullRequest
0 голосов
/ 22 марта 2019

В настоящее время я пытаюсь улучшить производительность моего кода на Python.Для этого я успешно использую Numba.Чтобы улучшить структуру моего кода, я создаю функции.Теперь я с удивлением заметил, что если я разделю код на разные функции numba, код будет значительно медленнее, чем если бы я поместил весь код в одну функцию с помощью декоратора numba.Примером может быть:

@nb.njit
def fct_4(a, b):
    x = a ^ b
    setBits = 0
    while x > 0:
        setBits += x & 1
        x >>= 1
    return setBits


@nb.njit
def fct_3(c, set_1, set_2):
    h = 2
    if c not in set_1 and c not in set_2:
        if fct_4(0, c) <= h:
            set_1.add(c)
        else:
            set_2.add(c)


@nb.njit
def fct_2(c, set_1, set_2):
    fct_3(c, set_1, set_2)


@nb.njit
def fct_1(set_1, set_2):
    for x1 in range(1000):
        c = 2
        fct_2(c, set_1, set_2)

медленнее, чем

@nb.njit
def fct_1(set_1, set_2):
    for x1 in range(1000):
        c = 2       
        h = 2
        if c not in set_1 and c not in set_2:
            if fct_4(0, c) <= h:
                set_1.add(c)
            else:
                set_2.add(c)

с

@nb.njit
def main_fct(set_1, set_2):
    for i in range(50):
        for x in range(1000):
            fct_1(set_1, set_2)

set_1 = {0}
set_2 = {47}

start = timeit.default_timer()
main_fct(set_1, set_2)
stop = timeit.default_timer()

(2,70 секунды против 0,46 секунды).Я думал, что это не должно иметь значение.Не могли бы вы просветить меня?

1 Ответ

1 голос
/ 22 марта 2019

Поскольку python является динамически типизированным языком, его служебные вызовы довольно высоки.

Кроме того, вы перебираете вызовы функций, поэтому время выполнения при вызове функции и проверке аргументов умножается в 1000 раз.

...