首页 > 解决方案 > 为什么使用 Numba 编译代码时不会执行此 while 循环?

问题描述

我有一小段代码,如下所示:

@njit
def looptest():
    value0 = np.NaN
    while math.isnan(value0):
        print('Nan 2: ', math.isnan(value0))
        break

令人惊讶的是,该打印从未执行。

Numba 表示支持 math.isnan:https ://numba.pydata.org/numba-doc/latest/developer/autogen_math_listing.html#math.isnan

所以我尝试了cmath,这也被认为是受支持的。结果相同:循环永远不会执行,但只有在使用 Numba 编译时才会执行。如果我禁用 JIT 编译,它会打印得很好。

然后我添加了一些调试信息:

@njit
def looptest():
    value0 = np.NaN
    print('Nan 1: ', cmath.isnan(value0))
    print(value0)
    while cmath.isnan(value0):
        print('Nan 2: ', cmath.isnan(value0))
        break

我看到,即使使用 Numba 编译,它isnan似乎也能正确解析为 True:

Nan 1:  True
nan

然而,再次令我惊讶的是,当使用 Numba 编译时,while 循环内的第二个打印不会执行。

我尝试使用NUMBA_OPT=1NUMBA_OPT=0- 相同的结果来减少优化。

到底是怎么回事?如何编写此代码,以便无论是否使用 Numba 编译,while 循环都将执行相同的操作?

标签: pythonpython-3.xnannumba

解决方案


推荐阅读