python引入jit_python – 使用numba.jit编译一系列条件需要很长时间

博客讨论了使用Numba的JIT编译器处理包含大量条件语句的函数时遇到的性能瓶颈。当条件语句数量超过一定阈值,编译时间显著增加。解决方案是通过展开条件表达式并直接赋值给数组来提高效率。这种方法减少了编译时间,并保持了功能的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果我尝试使用numba的jit-compiler编译包含一系列条件的函数,则需要很长时间.该程序看起来基本上像

from numba import jit

import numpy as np

@jit(nopython=True)

def foo(a, b):

valid = [

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0),

(a - 1 >= 0) and (b - 1 >= 0)

]

foo(1, 1)

我已经排除了所有不会显着改变编译时间的东西.如果我使用超过20个元素,就会出现问题.

| elements | time |

-------------------

| 21 | 2.7s |

| 22 | 5.1s |

| 23 | 10s |

| ... | ... |

-------------------

尽管如此,该功能运作良好.有人知道,为什么需要这么长时间,用numba编译这样的函数?使用整数或浮点数组合以类似方式创建数组不会产生任何问题.

解决方法:

>你可能想在numba issue tracker上报告这一点,感觉编译器中的某些东西出错,因为它的扩展性很差.

>您也可以考虑是否真的需要大量这样的数组语句,如果问题可以更明确地重构.例如.而不是布尔数组,有效是一个被称为需要的函数吗?

>尽管如此,当前版本的numba中的解决方法正在展开这些条件.

对于你的例子:

# "codegen"

for i in range(23):

print(f' valid[{i}] = (a - 1 >= 0) and (b - 1 >= 0)')

@jit(nopython=True)

def foo(a, b):

valid = np.empty(23, dtype=np.bool_)

valid[0] = (a - 1 >= 0) and (b - 1 >= 0)

valid[1] = (a - 1 >= 0) and (b - 1 >= 0)

valid[2] = (a - 1 >= 0) and (b - 1 >= 0)

valid[3] = (a - 1 >= 0) and (b - 1 >= 0)

valid[4] = (a - 1 >= 0) and (b - 1 >= 0)

valid[5] = (a - 1 >= 0) and (b - 1 >= 0)

valid[6] = (a - 1 >= 0) and (b - 1 >= 0)

valid[7] = (a - 1 >= 0) and (b - 1 >= 0)

valid[8] = (a - 1 >= 0) and (b - 1 >= 0)

valid[9] = (a - 1 >= 0) and (b - 1 >= 0)

valid[10] = (a - 1 >= 0) and (b - 1 >= 0)

valid[11] = (a - 1 >= 0) and (b - 1 >= 0)

valid[12] = (a - 1 >= 0) and (b - 1 >= 0)

valid[13] = (a - 1 >= 0) and (b - 1 >= 0)

valid[14] = (a - 1 >= 0) and (b - 1 >= 0)

valid[15] = (a - 1 >= 0) and (b - 1 >= 0)

valid[16] = (a - 1 >= 0) and (b - 1 >= 0)

valid[17] = (a - 1 >= 0) and (b - 1 >= 0)

valid[18] = (a - 1 >= 0) and (b - 1 >= 0)

valid[19] = (a - 1 >= 0) and (b - 1 >= 0)

valid[20] = (a - 1 >= 0) and (b - 1 >= 0)

valid[21] = (a - 1 >= 0) and (b - 1 >= 0)

valid[22] = (a - 1 >= 0) and (b - 1 >= 0)

%time foo(1,1)

Wall time: 274 ms

标签:python,time,jit,condition,numba

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值