嵌套Numba函数性能

时间:2019-03-22 00:22:50

标签: python numba

当前,我正在尝试提高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秒vs 0.46秒)。我认为这不应该有所作为。你能启发我吗?

1 个答案:

答案 0 :(得分:1)

由于python是一种动态类型的语言,因此其函数调用开销非常高。

最重要的是,您正在遍历函数调用,因此调用函数和检查参数所花费的执行时间要乘以1000倍。