当前,我正在尝试提高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秒)。我认为这不应该有所作为。你能启发我吗?
答案 0 :(得分:1)
由于python是一种动态类型的语言,因此其函数调用开销非常高。
最重要的是,您正在遍历函数调用,因此调用函数和检查参数所花费的执行时间要乘以1000倍。