1

@jitコードを高速化するために数日間取り組んできました。@jit最後に、オブジェクトメソッドへ の追加について説明して、これに出くわしました: http://williamjshipman.wordpress.com/2013/12/24/learning-python-eight-ways-to-filter-an-image

と呼ばれるクラスがGentleBoostCあり、その中の と呼ばれるメソッドを高速化したいと考えていtrainます。 train3 つの引数 (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
4

1 に答える 1

2

ドキュメントからわかることから、デコレータをメソッドに適用することはできません。class表示されるエラーは、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)    
于 2014-09-05T10:38:01.277 に答える