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
是同一个对象,我只是选择了一个不同的名称,以区别于方法的第一个参数的通用约定。现在有一个后续问题:。。。是否与对对象或其他对象的有限支持有关?要将函数保留在类主体中,可以将其设置为类的静态方法,如中所示