我发现,当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
;有时是5
,9
,12
等,基本上是不稳定的输出)我们在控制台中运行文件的时间(我正在使用ipython
版本7.8.0
)
我不确定这种情况的发生原因和发生方式(可能是由于numba
或spyder
或ipython
问题引起的,也可能是我的CPU损坏了,无法修复),这就是为什么我在这里寻求帮助。
注意:我正在使用:
Anaconda的python发行版,python版本3.7.4
,
spyder版本3.3.6
,
ipython版本7.8.0
,
numba版本0.45.1
OS Windows 10 64位
答案 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列表的行为符合预期。