python函数的显式签名,参数包括2d numpy数组

python函数的显式签名,参数包括2d numpy数组,python,numba,Python,Numba,我想使用@jit或@autojit来加速python代码,如下所述: 然而,该页面上的示例是针对纯python函数的,而我的函数在类中,并且基于更多的搜索,似乎为了使用类函数,我必须提供函数的显式签名 我以前没有使用过签名,但现在我了解了如何将它们用于具有简单参数的函数。但我一直在研究如何为复杂的参数(如2D数组)编写它们 下面是我需要明确签名的函数。 除了@void,我真的不知道该写什么 """ Function: train Input parameters: #X = s

我想使用
@jit
@autojit
来加速python代码,如下所述:

然而,该页面上的示例是针对纯python函数的,而我的函数在类中,并且基于更多的搜索,似乎为了使用类函数,我必须提供函数的显式签名

我以前没有使用过签名,但现在我了解了如何将它们用于具有简单参数的函数。但我一直在研究如何为复杂的参数(如2D数组)编写它们

下面是我需要明确签名的函数。 除了
@void
,我真的不知道该写什么

""" Function: train
    Input parameters:
    #X =  shape: [n_samples, n_features]
    #y = classes corresponding to X , y's shape: [n_samples]
    #H = int, number of boosting rounds
    Returns: None
    Trains the model based on the training data and true classes
    """
    #@autojit
    #@void
    def train(self, X, y, H):
           # function code below
           # do lots of stuff...
编辑 鉴于我的参数类型,我尝试了以下方法:

@void(float_[:,:],int_[:],int_)
但出现以下错误:

Traceback (most recent call last):
  File "C:\Users\app\Documents\Python Scripts\gbc_carclassify.py", line 18, in <module>
    import gentleboost_c_class as gbc
  File "C:\Users\app\Documents\Python Scripts\gentleboost_c_class.py", line 20, in <module>
    @jit
  File "C:\Users\app\Anaconda\lib\site-packages\numba\decorators.py", line 272, in jit
    return jit_extension_class(cls, kws, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\exttypes\entrypoints.py", line 20, in jit_extension_class
    return jitclass.create_extension(env, py_class, translator_kwargs)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\exttypes\jitclass.py", line 98, in create_extension
    ext_type = typesystem.jit_exttype(py_class)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\typesystem\types.py", line 55, in __call__
    return type.__call__(self, *args)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\exttypes\types\extensiontype.py", line 37, in __init__
    assert isinstance(py_class, type), ("Must be a new-style class "
AssertionError: Must be a new-style class (inherit from 'object')
但现在我得到了这个错误:

C:\Users\app\Anaconda\lib\site-packages\numba\exttypes\validators.py:74: UserWarning: Constructor for class 'GentleBoostC' has no signature, assuming arguments have type 'object'
  ext_type.py_class.__name__)
Traceback (most recent call last):
  File "C:\Users\app\Documents\Python Scripts\gbc_carclassify.py", line 18, in <module>
    import gentleboost_c_class as gbc
  File "C:\Users\app\Documents\Python Scripts\gentleboost_c_class.py", line 21, in <module>
    class GentleBoostC(object):
  File "C:\Users\app\Anaconda\lib\site-packages\numba\decorators.py", line 272, in jit
    return jit_extension_class(cls, kws, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\exttypes\entrypoints.py", line 20, in jit_extension_class
    return jitclass.create_extension(env, py_class, translator_kwargs)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\exttypes\jitclass.py", line 110, in create_extension
    extension_compiler.infer()
  File "C:\Users\app\Anaconda\lib\site-packages\numba\exttypes\compileclass.py", line 112, in infer
    self.type_infer_methods()
  File "C:\Users\app\Anaconda\lib\site-packages\numba\exttypes\compileclass.py", line 145, in type_infer_methods
    self.type_infer_method(method)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\exttypes\compileclass.py", line 121, in type_infer_method
    **self.flags)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 133, in compile2
    func_ast = functions._get_ast(func)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\functions.py", line 89, in _get_ast
    ast.PyCF_ONLY_AST | flags, True)
  File "C:\Users\app\Documents\Python Scripts\gentleboost_c_class.py", line 1
    def train(self, X, y, H):
    ^
IndentationError: unexpected indent
C:\Users\app\Anaconda\lib\site packages\numba\exttypes\validators.py:74:UserWarning:GentleBoostC类的构造函数没有签名,假设参数的类型为“object”
ext_type.py_class.\uuu名称\uuu)
回溯(最近一次呼叫最后一次):
文件“C:\Users\app\Documents\Python Scripts\gbc\u carclassify.py”,第18行,在
将gentleboost_c_类作为gbc导入
文件“C:\Users\app\Documents\Python Scripts\gentleboost\u C\u class.py”,第21行,在
类GentleBoostC(对象):
文件“C:\Users\app\Anaconda\lib\site packages\numba\decorators.py”,第272行,jit格式
返回jit扩展类(cls、kws、env)
文件“C:\Users\app\Anaconda\lib\site packages\numba\exttypes\entrypoints.py”,第20行,在jit\u扩展\u类中
返回jitclass.create_扩展(env、py_类、translator_-kwargs)
文件“C:\Users\app\Anaconda\lib\site packages\numba\exttypes\jitclass.py”,第110行,在create\U扩展名中
扩展_编译器.expert()
文件“C:\Users\app\Anaconda\lib\site packages\numba\exttypes\compileclass.py”,第112行,在推断中
self.type_expert_方法()
文件“C:\Users\app\Anaconda\lib\site packages\numba\exttypes\compileclass.py”,第145行,在类型推断方法中
自我类型推断方法(方法)
文件“C:\Users\app\Anaconda\lib\site packages\numba\exttypes\compileclass.py”,第121行,在类型推断方法中
**自我保护(国旗)
文件“C:\Users\app\Anaconda\lib\site packages\numba\pipeline.py”,第133行,在compile2中
func_ast=函数。_get_ast(func)
文件“C:\Users\app\Anaconda\lib\site packages\numba\functions.py”,第89行,在
ast.PyCF_仅_ast|标志,真)
文件“C:\Users\app\Documents\Python Scripts\gentleboost\u C\u class.py”,第1行
def序列(自身、X、y、H):
^
缩进错误:意外缩进

我想我没有缩进错误。。。在将
object
添加到类之前,我对这段完全相同的代码没有任何问题

在数据类型上使用切片语法来表示数组。因此,您的示例可能类似于:

from numba import void, int_, float_, jit

...

@jit
class YourClass(object):

    ...

    @void(float_[:, :], int_[:], int_)
    def train(self, X, y, H):
         # X is typed as a 2D float array and y as a 1D int array.
         pass

我试过你说的,但出现了一个错误,请看我编辑的问题。是的,我忘记了-numba类必须是新样式的类,所以你必须让你的类从对象继承。我编辑了我的答案以反映这一点。谢谢-但这又产生了另一个错误!我在问题中添加了第二个编辑。如果函数没有任何可执行代码,请确保在函数中输入pass。我所有的函数都有很多可执行代码。。。并非所有函数都返回任何内容,但它们都执行某种代码执行。这是一个完全定义的工作类,包含我使用过的函数,我现在只想加快它的速度。
from numba import void, int_, float_, jit

...

@jit
class YourClass(object):

    ...

    @void(float_[:, :], int_[:], int_)
    def train(self, X, y, H):
         # X is typed as a 2D float array and y as a 1D int array.
         pass