2017-04-02 118 views
1

当我尝试运行此代码:是什么导致Numba的AttributeError:'NoneType'对象没有属性'pysig'?

from numba import njit, int64 
from numba.types import List 

@njit(int64(List(int64, True))) 
def f(a): 
    a[0] = 0 
    return a[0] 

@njit(List(int64)()) 
def g(): return [f([0])] 

我得到以下。为什么是这样?我如何使它正确地找出类型?

Traceback (most recent call last): 
    File "Temp.py", line 9, in <module> 
    @njit(List(int64)()) 
    File "numba\decorators.py", line 172, in wrapper 
    disp.compile(sig) 
    File "numba\dispatcher.py", line 350, in compile 
    flags=flags, locals=self.locals) 
    File "numba\compiler.py", line 644, in compile_extra 
    return pipeline.compile_extra(func) 
    File "numba\compiler.py", line 361, in compile_extra 
    return self.compile_bytecode(bc, func_attr=self.func_attr) 
    File "numba\compiler.py", line 370, in compile_bytecode 
    return self._compile_bytecode() 
    File "numba\compiler.py", line 631, in _compile_bytecode 
    return pm.run(self.status) 
    File "numba\compiler.py", line 251, in run 
    raise patched_exception 
numba.errors.TypingError: Caused By: 
Traceback (most recent call last): 
    File "numba\compiler.py", line 243, in run 
    res = stage() 
    File "numba\compiler.py", line 458, in stage_nopython_frontend 
    self.locals) 
    File "numba\compiler.py", line 759, in type_inference_stage 
    infer.propagate() 
    File "numba\typeinfer.py", line 510, in propagate 
    raise errors[0] 
TypingError: Internal error at <numba.typeinfer.CallConstraint object at 0x00000000071C82E8>: 
--%<----------------------------------------------------------------- 
Traceback (most recent call last): 
    File "numba\typeinfer.py", line 111, in propagate 
    constraint(typeinfer) 
    File "numba\typeinfer.py", line 270, in __call__ 
    self.resolve(typeinfer, typevars, fnty) 
    File "numba\typeinfer.py", line 297, in resolve 
    sig = context.resolve_function_type(fnty, pos_args, kw_args) 
    File "numba\typing\context.py", line 113, in resolve_function_type 
    return func.get_call_type(self, args, kws) 
    File "numba\types.py", line 334, in get_call_type 
    sig.pysig = self.pysig 
AttributeError: 'NoneType' object has no attribute 'pysig' 
--%<----------------------------------------------------------------- 
File "Temp.py", line 10 

回答

1

@njit(int64(List(int64, True)))更改为f装饰签名@njit(int64(List(int64)))使事情为我工作的Numba 0.31.0。

对于f,a不是反映的列表,所以看起来将该标志设置为True会导致问题。对于Numba 0.31.0,我收到了一条不同的错误消息。

一般来说,我会允许Numba对输入和输出进行自己的类型推断。我不确定你使用的是什么版本,但在最近的版本中,很少有理由在装饰器签名中定义类型。如果您对类型推理程序的作用感到好奇,只需使用nb.njitnb.jit(nopython=True),使用所需的输入调用函数,然后检查f.inspect_types()(如果您的jitted函数为f)。

+0

事实证明,我看到的核心问题是我的Numba版本的问题(但你提到的问题也存在)。谢谢! (PS,让Numba弄清楚这些类型的一个问题是它会延迟到调用之前,这会增加额外的延迟,我不喜欢,尤其是在分析时)。 – Mehrdad

相关问题