Всякий раз, когда я пытаюсь использовать @jit в своем методе класса, я получаю IndentationError: неожиданный отступ

Я пытался в течение нескольких дней, чтобы получить @jit работает, чтобы ускорить мой код. Наконец я наткнулся на это, описывая добавление @jit методы объекта: http://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 ответ

Решение

Из того, что я вижу из документации, вы не можете применить декоратор к методу; ошибка, которую вы видите из-за синтаксического анализатора 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)    
Другие вопросы по тегам