while循环执行jited函数中的奇怪行为和不稳定行为

时间:2019-09-29 08:35:11

标签: python python-3.x while-loop spyder numba

我发现,当numpy数组的索引在一个njit装饰函数的while循环内超出范围时,该函数处理while循环的方式可能会很奇怪,并且我不确定为什么会这样。

from numba import njit
import numpy as np


def func1(v):
    i= 0
    K= v[-1]+1
    while v[i] < K:
        i+=1
    return i

@njit        
def func2(v):
    i= 0
    K= v[-1]+1
    while v[i] < K:
        i+=1
    return i

x= np.arange(2)
result2 = func2(x)
result1 = func1(x)

以下是结果的简短摘要:

1)func2不会筹集IndexError

2)每隔func2返回不同的结果(例如有时是4;有时是5912等,基本上是不稳定的输出)我们在控制台中运行文件的时间(我正在使用ipython版本7.8.0

我不确定这种情况的发生原因和发生方式(可能是由于numbaspyderipython问题引起的,也可能是我的CPU损坏了,无法修复),这就是为什么我在这里寻求帮助。


注意:我正在使用:

  • Anaconda的python发行版,python版本3.7.4

  • spyder版本3.3.6

  • ipython版本7.8.0

  • numba版本0.45.1

  • OS Windows 10 64位

2 个答案:

答案 0 :(得分:3)

出于性能原因,Numba不会对Numpy数组进行边界检查。当前正在有选择地将其打开(https://github.com/numba/numba/pull/4432)。当您超出数组的边界时,您将获得该位置内存中的任何内容,或者可能出现段错误。

答案 1 :(得分:1)

我以前听说过Numba,但我自己从未使用过。

这是刚才一些混乱的结果(0.45.1版)。

from numba import njit
import numpy as np

x = np.arange(2)

@njit        
def func2(v):
    i = 0
    k = v[-1]+1
    while v[i] < k:
        i += 1
    return i

@njit
def func3(x):
    return x[2]



func2(x)  # returns 2, but no error raised

func3(x)  # returns 32, no error raised 
func3(np.array([0]))   # returns 32, no error raised

func2([0, 1])  # IndexError raised
func3([0, 1])  # IndexError raised

对我而言,该错误似乎是Numba的jit与Numpy数组之间某种形式的交互的结果,因为普通的Python列表的行为符合预期。