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

时间:2014-09-05 10:16:26

标签: python jit numba

我已经尝试了几天让@jit努力加快我的代码速度。 最后我遇到了这个,描述了向对象方法添加@jithttp://williamjshipman.wordpress.com/2013/12/24/learning-python-eight-ways-to-filter-an-image

我有一个名为GentleBoostC的类,我希望加快其中名为train的方法。 train接受三个参数(一个二维数组,一个数组和一个整数),并且不返回任何参数。

这就是我在代码中所拥有的:

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

但是我不断收到缩进错误,指向定义列车功能的行。我的缩进没有错。我重新缩进了我的整个代码。如果我用@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

1 个答案:

答案 0 :(得分:3)

从文档中我可以看到,无法将装饰器应用于方法;您看到的错误来自JIT解析器,当不在class语句的上下文中时,它不处理源代码缩进。

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

@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)