numba nopython 模式 "Undefined variable '3.3'"
numba nopython mode "Undefined variable '$313.3'"
这是我从图像构建最小树的代码(f
是 scipy 提供的图像)
是我写的一个拼缝程序的基础
此代码段正常工作 python。当我在没有 nopython=True
的情况下使用 @numba.jit
时,它也可以工作(性能提高约 200%!),但这是在对象模式下。
当我尝试使用 nopython=True
模式时,它无法编译并且出现错误:
Failed at nopython (nopython frontend)
Undefined variable '3.3'
我不明白为什么这不会编译,因为我没有看到任何可能未定义的东西。
from numba import jit
from scipy import misc
import numba
f = misc.face()
@jit(nopython=True)
def explorethisx(inar, x):
places = []
places.append((x,0))
x1,y1 = x,0
s = numba.int64(0)
co = 0
#for _ in range( 799):
while co != numba.int16(799):
co += 1
a1,a2,a3 = 999,999,999
a1 = inar[y1 + 1][x1-1][1]
a2 = inar[y1 + 1][x1][1]
a3 = inar[y1 + 1][x1 + 1][1]
m = a1
ch = -1
if m > a2:
m = a2
ch = 0
if m > a3:
m = a3
ch = 1
x1 = x1 + ch
y1 = y1 + 1
s += inar[y1][x1][1]
places.append((x1,y1))
return([s, places])
explorethisx(f,3)
explorethisx.inspect_types()
Numba 是一个非常酷的项目,即使在 python 对象模式下,性能改进也给我留下了深刻的印象。
异常消息具有误导性。只是 numba 只支持同类列表,所以当你尝试 return [s, places]
你 return 一个包含一个 "integer" 和一个 "list of tuples of integers" 的列表这不再是同质的了。
请注意,这个最小示例已经演示了该异常:
from numba import jit
@jit(nopython=True)
def test():
places = []
places.append((1, 2))
places.append((2, 3))
return [10, places]
>>> test()
...
TypingError: Failed at nopython (nopython frontend)
Undefined variable '[=10=].12'
你可以简单地 return 一个元组:
return (s, places)
而不是旧的
return([s, places])
即使这可以编译 - 该函数在调用函数时包含越界内存访问(我遇到了段错误),因此您肯定还需要检查内存访问。
这是我从图像构建最小树的代码(f
是 scipy 提供的图像)
是我写的一个拼缝程序的基础
此代码段正常工作 python。当我在没有 nopython=True
的情况下使用 @numba.jit
时,它也可以工作(性能提高约 200%!),但这是在对象模式下。
当我尝试使用 nopython=True
模式时,它无法编译并且出现错误:
Failed at nopython (nopython frontend)
Undefined variable '3.3'
我不明白为什么这不会编译,因为我没有看到任何可能未定义的东西。
from numba import jit
from scipy import misc
import numba
f = misc.face()
@jit(nopython=True)
def explorethisx(inar, x):
places = []
places.append((x,0))
x1,y1 = x,0
s = numba.int64(0)
co = 0
#for _ in range( 799):
while co != numba.int16(799):
co += 1
a1,a2,a3 = 999,999,999
a1 = inar[y1 + 1][x1-1][1]
a2 = inar[y1 + 1][x1][1]
a3 = inar[y1 + 1][x1 + 1][1]
m = a1
ch = -1
if m > a2:
m = a2
ch = 0
if m > a3:
m = a3
ch = 1
x1 = x1 + ch
y1 = y1 + 1
s += inar[y1][x1][1]
places.append((x1,y1))
return([s, places])
explorethisx(f,3)
explorethisx.inspect_types()
Numba 是一个非常酷的项目,即使在 python 对象模式下,性能改进也给我留下了深刻的印象。
异常消息具有误导性。只是 numba 只支持同类列表,所以当你尝试 return [s, places]
你 return 一个包含一个 "integer" 和一个 "list of tuples of integers" 的列表这不再是同质的了。
请注意,这个最小示例已经演示了该异常:
from numba import jit
@jit(nopython=True)
def test():
places = []
places.append((1, 2))
places.append((2, 3))
return [10, places]
>>> test()
...
TypingError: Failed at nopython (nopython frontend)
Undefined variable '[=10=].12'
你可以简单地 return 一个元组:
return (s, places)
而不是旧的
return([s, places])
即使这可以编译 - 该函数在调用函数时包含越界内存访问(我遇到了段错误),因此您肯定还需要检查内存访问。