Python 每当我尝试在我的类方法上使用@jit时,我都会得到IndentationError:意外的缩进

Python 每当我尝试在我的类方法上使用@jit时,我都会得到IndentationError:意外的缩进,python,jit,numba,Python,Jit,Numba,几天来,我一直在努力让@jit工作以加快代码的速度。 最后,我遇到了这个问题,描述了如何向对象方法添加@jit: 我有一个名为GentleBoostC的类,我想加速其中名为train的方法。 train接受三个参数(2D数组、1D数组和整数),但不返回任何内容 这就是我的代码: import numba from numba import jit, autojit, int_, void, float_, object_ class GentleBoostC(object): #

几天来,我一直在努力让
@jit
工作以加快代码的速度。 最后,我遇到了这个问题,描述了如何向对象方法添加
@jit

我有一个名为
GentleBoostC
的类,我想加速其中名为
train
的方法。
train
接受三个参数(2D数组、1D数组和整数),但不返回任何内容

这就是我的代码:

import numba
from numba import jit, autojit, int_, void, float_, object_


class GentleBoostC(object):
    # lots of functions

    # and now the function I want to speed up
    @jit (void(object_,float_[:,:],int_[:],int_)) 
    def train(self, X, y, H):
        # do stuff
但我不断得到一个缩进错误,指向定义train函数的行。我的缩进没有问题。我已经重新缩进了我的全部代码。如果我用
@jit
注释掉这行,那么就没有问题了

下面是确切的错误:

   @jit (void(object_,float_[:,:],int_[:],int_))
  File "C:\Users\app\Anaconda\lib\site-packages\numba\decorators.py", line 224, in _jit_decorator
    nopython=nopython, func_ast=func_ast, **kwargs)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\decorators.py", line 133, in compile_function
    func_env = pipeline.compile2(env, func, restype, argtypes, func_ast=func_ast, **kwds)
  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_jit_v5_nolimit.py", line 1
    def train(self, X, y, H):
    ^
IndentationError: unexpected indent

从我在文档中看到的情况来看,您不能将decorator应用于方法;您看到的错误来自JIT解析器,当不在
语句的上下文中时,它没有处理源代码缩进

如果希望编译该方法的主体,则需要将其分解为单独的函数,并从该方法调用该函数:

@jit(void(object_, float_[:,:], int_[:], int_)) 
def train_function(instance, X, y, H):
    # do stuff

class GentleBoostC(object):
    def train(self, X, y, H):
        train_function(self, X, y, H)    

使用
python-tt
运行脚本。您可能确实有缩进问题。那么,
cat-eT filename.py
显示了什么?看看
@jit
行和周围的上下文。那么,为什么在我注释掉@jit行时它一点问题都没有?无论如何,我如何使用python-tt?我正在使用Anaconda的Spyder运行python-我将如何从那里运行它?有两个选项:
@jit
行混合制表符和与其他行不一致的空格,或者您使用的是一个还不支持decorators的古老Python版本。我使用的是Python 2.7,但我的@jit行正确吗?但是train方法访问许多类数据成员,它会影响现有成员。。。那么这是否意味着我需要将它们全部作为参数传递,然后返回受影响的内容?@user961627:这就是为什么
train_函数
函数接受
实例
第一个参数的原因。它与
self
是同一个对象,我只是选择了一个不同的名称,以区别于方法的第一个参数的通用约定。现在有一个后续问题:。。。是否与对对象或其他对象的有限支持有关?要将函数保留在类主体中,可以将其设置为类的静态方法,如中所示