Всякий раз, когда я пытаюсь использовать @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)