Python 如何在numba中使用自定义类型为方法指定函数签名

Python 如何在numba中使用自定义类型为方法指定函数签名,python,numpy,numba,Python,Numpy,Numba,我使用numba.jitclassdecorator标记我的类以进行优化 我不知道如何指定要优化的run方法的签名。该方法将ConvertedDocument对象数组作为参数。似乎numba无法自行确定数组类型,因为在我尝试以nopython模式调用run方法时出现以下错误: Traceback (most recent call last): File "numba_test.py", line 53, in <module> print run(a) File "

我使用
numba.jitclass
decorator标记我的类以进行优化

我不知道如何指定要优化的
run
方法的签名。该方法将
ConvertedDocument
对象数组作为参数。似乎numba无法自行确定数组类型,因为在我尝试以nopython模式调用run方法时出现以下错误:

Traceback (most recent call last):
  File "numba_test.py", line 53, in <module>
    print run(a)
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/dispatcher.py", line 310, in _compile_for_args
    raise e
numba.errors.TypingError: Caused By:
Traceback (most recent call last):
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/compiler.py", line 230, in run
    stage()
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/compiler.py", line 444, in stage_nopython_frontend
    self.locals)
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/compiler.py", line 800, in type_inference_stage
    infer.propagate()
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/typeinfer.py", line 767, in propagate
    raise errors[0]
TypingError: Internal error at <numba.typeinfer.ExhaustIterConstraint object at 0x788cc9572d50>:
--%<-----------------------------------------------------------------
Traceback (most recent call last):
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/typeinfer.py", line 128, in propagate
    constraint(typeinfer)
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/typeinfer.py", line 264, in __call__
    raise TypingError("failed to unpack {}".format(tp), loc=self.loc)
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/errors.py", line 249, in new_error_context
    six.reraise(type(newerr), newerr, sys.exc_info()[2])
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/errors.py", line 243, in new_error_context
    yield
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/typeinfer.py", line 264, in __call__
    raise TypingError("failed to unpack {}".format(tp), loc=self.loc)
InternalError: local variable 'tp' referenced before assignment
[1] During: typing of exhaust iter at numba_test.py (40)
--%<-----------------------------------------------------------------

File "numba_test.py", line 40

Failed at nopython (nopython frontend)
Internal error at <numba.typeinfer.ExhaustIterConstraint object at 0x788cc9572d50>:
--%<-----------------------------------------------------------------
Traceback (most recent call last):
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/typeinfer.py", line 128, in propagate
    constraint(typeinfer)
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/typeinfer.py", line 264, in __call__
    raise TypingError("failed to unpack {}".format(tp), loc=self.loc)
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/errors.py", line 249, in new_error_context
    six.reraise(type(newerr), newerr, sys.exc_info()[2])
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/errors.py", line 243, in new_error_context
    yield
  File "/home/clasocki/anaconda2/envs/my_numba_env/lib/python2.7/site-packages/numba/typeinfer.py", line 264, in __call__
    raise TypingError("failed to unpack {}".format(tp), loc=self.loc)
InternalError: local variable 'tp' referenced before assignment
[1] During: typing of exhaust iter at numba_test.py (40)
--%<-----------------------------------------------------------------

File "numba_test.py", line 40

This error may have been caused by the following argument(s):
- argument 0: Unsupported array dtype: object
这就是
run
方法的调用方式:

x = numpy.asarray([1.0, 2.0])
y = numpy.asarray([(1.0,2.0), (3.0,4.0)])
a = numpy.asarray([ConvertedDocument(x,y)])
print run(a)
如果用Python列表替换
a
numpy数组,则异常如下:

Failed at nopython (nopython mode backend)
reflected list(instance.jitclass.ConvertedDocument#3bffb70<profile:array(float64, 1d, C),word_weights:array(float64, 2d, C)>): unsupported nested memory-managed object
在nopython(nopython模式后端)失败
反射列表(instance.jitclass.ConvertedDocument#3bffb70):不支持的嵌套内存管理对象

有人知道在使用自定义类型时如何指定方法签名,或者是否支持对对象数组的迭代吗?

问题似乎是,您不能在
jitclass
对象上调用
np.nditer
,这很有意义,因为
jitclass
不可迭代。它将数据存储为数组结构(和其他数据类型),而不是结构数组。您正试图将其用作后者。如果除了两个数组属性外,还有一组标量数据属性或大小不同的数组,那么如何迭代jitclass对象就不明确了


诚然,错误信息并不清楚。我的建议是迭代您直接需要的
word\u权重的索引

谢谢你的回复。问题是,
docs
是一个文档数组,而不是一个单一的
jitclass
对象,所以我试图迭代一个可重用的文档数组。我更新了我的示例,删除了
np.nditer
,这可能根本就没有必要,导致了前面的错误。现在的错误是不同的,这表明目前可能不支持这种迭代,但我不确定。
Failed at nopython (nopython mode backend)
reflected list(instance.jitclass.ConvertedDocument#3bffb70<profile:array(float64, 1d, C),word_weights:array(float64, 2d, C)>): unsupported nested memory-managed object