当前位置:  开发笔记 > 编程语言 > 正文

numba nopython模式"Undefined variable'$ 313.3'"

如何解决《numbanopython模式"Undefinedvariable'$313.3'"》经验,为你挑选了1个好方法。

这是我从图像构造最小树的代码(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对象模式下,我也对性能改进印象深刻.



1> MSeifert..:

异常消息具有误导性.只是numba只支持同类列表,所以当你尝试返回时[s, places],返回一个包含一个"整数"和一个"整数元组列表"的列表,它不再是同类的.

请注意,这个最小的例子已经证明了异常:

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 '$0.12'

你可以简单地返回一个元组:

return (s, places)

而不是旧的

return([s, places])

即使这个编译 - 该函数在调用函数时包含一个越界内存访问(我有一个段错误),所以你肯定也需要检查你的内存访问.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有