Python 为什么numba不能使用这个嵌套函数?

Python 为什么numba不能使用这个嵌套函数?,python,python-3.x,precompile,Python,Python 3.x,Precompile,我在这里报告了所描述的错误:,如果有人对问题的解决方案感兴趣 我正在尝试使用numba预编译运行在3D时间序列数据上的最小化。作为第一步,我想定义一个成本函数,但这已经失败了。这是我的密码: from numba import jit @jit def tester(axis,data): def lineCost(pars): A=pars[0] B=pars[1] return np.sum((A*axis+B - data)**2)

我在这里报告了所描述的错误:,如果有人对问题的解决方案感兴趣

我正在尝试使用numba预编译运行在3D时间序列数据上的最小化。作为第一步,我想定义一个成本函数,但这已经失败了。这是我的密码:

from numba import jit

@jit
def tester(axis,data):
    def lineCost(pars):
        A=pars[0]
        B=pars[1]
        return np.sum((A*axis+B - data)**2)
    return lineCost([axis,data])

tester(1,2)
这会产生一个“未实现”错误:

~/.local/lib/python3.5/site-packages/numba/looving.py在lower(self)中
171如果self.generator_info为无:
172 self.genlower=无
-->173自下而上正常功能(自下而上)
174.其他:
175 self.genlower=自发电功率(self)
lower\u normal\u函数中的~/.local/lib/python3.5/site-packages/numba/lowering.py(self,fndesc)
212#初始参数值
213 self.extract_函数_参数()
-->214入口\块\尾=自身。下部\功能\主体()
215
216#关闭入口挡块的尾部
下部功能体中的~/.local/lib/python3.5/site-packages/numba/looving.py(self)
237 bb=自blkmap[偏移量]
238自组装器。将_放置在_端(bb)
-->239自下位块(块)
240
241.自选职位(下)
下部块中的~/.local/lib/python3.5/site-packages/numba/looving.py(self,block)
252具有新的错误上下文('在{loc}处降低“{inst}”,inst=inst,
253 loc=self.loc,errcls\ux=defaulterrcls):
-->254自下仪表(仪表)
255
256 def create_cpython_包装(self,release_gil=False):
/usr/lib/python3.5/contextlib.py in\uuuuuu exit\uuuuuu(self、type、value、traceback)
75值=类型()
76尝试:
--->77自生成抛出(类型、值、回溯)
78 raise RUNTIMERROR(“抛出()后生成器未停止”)
79除作为exc的停止迭代外:
新错误上下文中的~/.local/lib/python3.5/site-packages/numba/errors.py
583从numba导入配置
584 tb=sys.exc_info()[2]如果config.FULL_回溯其他无
-->585六个重放(类型(newerr)、newerr、tb)
586
587
reraise中的~/.local/lib/python3.5/site-packages/numba/six.py(tp、value、tb)
657如果值.u回溯uu不是tb:
658通过回溯(tb)提升值
-->659提高价值
660
661其他:
LoweringError:在对象(对象模式后端)失败
make_函数(闭包=$0.3,默认值=无,名称=$const0.5,代码=)
文件“”,第3行:
def测试仪(轴,数据):
def管路成本(PAR):
^
[1] 在:降低(3)处的“$0.6=make_函数(闭包=0.3,默认值=None,名称=$const0.5,代码=<0x7fd7ada3b810处的代码对象行成本,文件“ipython-input-59-ef6835d3b147”,第3行>)”
-------------------------------------------------------------------------------

这本不应该发生,Numba的内部出现了问题。 请报告错误消息并进行回溯,同时使用最小复制器 地址:https://github.com/numba/numba/issues/new 如果需要更多帮助,请随时与Numba核心开发人员联系 直接访问:https://gitter.im/numba/numba 提前感谢您帮助改进Numba!
您能帮助我理解代码的哪一部分导致numba出现问题吗?那会有很大的帮助。谢谢大家!

最好的, Malte

避免全局变量(数据和轴在行成本中是全局的),避免包含函数和避免列表的函数([axis,data])

工作示例

from numba import jit

@jit
def lineCost(axis,data):
    return np.sum((axis*axis+data - data)**2)

@jit
def tester(axis,data):
    return lineCost(axis,data)

tester(1,2)
这些东西中的大多数应该在最新版本中可以使用,但是使用最新的特性(通常包含一些错误或一些不受支持的细节)是不推荐的


即使这样做可行,如果性能低于预期,我也不会感到惊讶。

事实上,这似乎是最新版本中删除的一个bug:)

“这本不应该发生,Numba的内部出现了问题。请报告错误消息并进行回溯,同时提供一个最小的复制器:如果需要更多帮助,请随时直接与Numba核心开发人员联系:“似乎很清楚您的下一步是什么。好的,谢谢,我想我可能会错过一些基本和基本的东西,因为我真的刚刚开始与麻木。那我就按建议进行。
from numba import jit

@jit
def lineCost(axis,data):
    return np.sum((axis*axis+data - data)**2)

@jit
def tester(axis,data):
    return lineCost(axis,data)

tester(1,2)