这是我构建图像最小树的代码(
这是我正在编写的缝合程序的基础。
这个片段在普通的python中按预期工作。当我使用
当我尝试使用
我不明白为什么这段代码无法编译,因为我没有看到任何可能未定义的变量或函数。
f
是由scipy提供的图像)。这是我正在编写的缝合程序的基础。
这个片段在普通的python中按预期工作。当我使用
@numba.jit
而没有nopython=True
时,它也可以工作(性能提高了约200%!),但这是在对象模式下。当我尝试使用
nopython=True
模式时,它无法编译,并出现错误:Failed at nopython (nopython frontend)
Undefined variable '$313.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对象模式下也能提供出色的性能改进。
x[i,j,k]
访问数组元素比使用x[i][j][k]
更快。因此,例如在整个代码中都使用inar[y1 + 1,x1-1,1]
等方式。这使得我对您的代码进行基准测试时加速了近1.6倍。这对于所有numpy/numba操作ndarrays都是正确的。 - JoshAdel%timeit
魔法进行分析。特别是在分析Numba代码时,您需要丢弃已编译函数的第一次执行,因为它将包括编译时间,而这只需要支付一次。 - JoshAdel