2017-08-28 21 views
1

Numba、jitclassを使用してクラスメソッドをスキップする方法を理解しようとしている

与えられたパス依存の計算は、まっすぐなNumpyでベクトル化することはできません非常に大きな再帰モデル(かなり大規模なfor-loop)を持っています。

def operations(self, i, ops_order_config): 

    ops_dict = self.ops_dict 

    for index in range(len(waterfall_config)): 
     try: 
      if isinstance(ops_config[index], tuple): 
       ops_dict[ops_config[index][0]](i, ops_config[index][1]) 
      else: 
       ops_dict[ops_config[index]](i) 
     except KeyError: 
      pass 

モデルのこの部分:

クラスは、しかし、私が注文したファッションのメソッドのいくつかを呼び出す一つのセクションを持っている、一般的にnumba優しい構文で、numpyの一連の配列を通ります柔軟性のためには非常に重要です。「config」は、適切な呼び出し方法とそれぞれのパラメータを含むタプルの順序付きリストです。 ops_dictは実際の自己を保持します。適切なパラメータでconfigから呼び出されます。

私がjitclassを作成している場合、この辞書の側面を飛ばす方法はありますか?

答えて

0

いいえ、jitclassを作成すると、すべての属性を入力する必要があり、関数を含む辞書やリスト/タプル(たとえjittedでも)はnumba 0.34ではサポートされていません。タイプとしてdictまたはobjectを使用しようとして例えば:nopythonモードでもないでは動作しませんisinstanceなどtryexceptを使用して、ほかに

TypeError: spec values should be Numba type instances, got <class 'dict'>

import numpy as np 
from numba import jitclass 

spec = [('dct', dict)] 

@jitclass(spec) 
class ClsWithObject(object): 
    def __init__(self, value): 
     self.dct = {} 

TypeError例外。

最良の選択肢は、純粋なPythonクラス内から呼び出される ted関数を使用することです。

+0

ありがとうございます。 jitclassが使用され、動作しているとき、nopythonモードが適用されていることを前提とした安全な仮定ですか? – user7038639

+0

@ user7038639はい。このクラスのすべてのメソッドはnopythonモードでコンパイルされます。 [docs](http://numba.pydata.org/numba-doc/dev/user/jitclass.html)には明示的に言及されています: "jitclassのすべてのメソッドはnopython関数にコンパイルされます.jitclassインスタンスのデータはコンパイルされた関数がインタプリタをバイパスして基礎となるデータに直接アクセスできるように、C互換構造としてヒープに割り当てられます。 :) – MSeifert

+0

Blah、これらの文書を10回読んだことがあります。ありがとう! – user7038639

0

Numbaコンパイルされた関数での辞書の使用に関しては、Numbaはこれをサポートしていません。私自身の仕事の中で私はこの問題に遭遇し、Numbaの辞書の実装(私によって作成されたものではない)がうまく動作することを発見しました.GitHubリポジトリはhereです。

関連する問題