5

Numba には、JIT コンパイルでループを高速化する驚くべき機能があります。ただし、重要なねじれは、numpy を使用する場合、新しい配列の作成が許可されないことです。幸いなことに、ほとんどの numpy 関数には、出力を --except に書き込むためのオプションのoutパラメーターが含まれていますnumpy.sort。最も明白な代替案は ですnumpy.ndarray.sort

@njit("void(f8[:])")
def sort_inplace(arr):
  arr.sort()

しかし、これはコンパイルに失敗し、

...
...
...
/Users/duckworthd/anaconda/lib/python2.7/site-packages/numba/typeinfer.pyc in propagate(self)
    293                 print("propagate".center(80, '-'))
    294             oldtoken = newtoken
--> 295             self.constrains.propagate(self.context, self.typevars)
    296             newtoken = self.get_state_token()
    297             if config.DEBUG:

/Users/duckworthd/anaconda/lib/python2.7/site-packages/numba/typeinfer.pyc in propagate(self, context, typevars)
    112                 raise
    113             except Exception as e:
--> 114                 raise TypingError("Internal error:\n%s" % e, constrain.loc)
    115
    116

TypingError: Internal error:
Attribute 'sort' of array(float64, 1d, A) is not typed

並べ替えアルゴリズムを再実装する以外に、JIT コンパイルされた numba ループで numpy 配列を並べ替える方法はありますか?

4

1 に答える 1

5

Numba はこれを「nopython」モードでコンパイルできるはずですが、残念ながらまだ ndarray.sort() のサポートを追加していません。「python」モードでコンパイルしますが、これはpythonオブジェクトレイヤーを通過する必要があるため遅くなりますが、ndarray.sort()がCで実装されているように見えるため、大きな違いはないかもしれません. numba の github issue tracker にバグ レポートを追加しました。

注意すべきもう 1 つの点は、numba は可能であればループを nopython モードでコンパイルし、残りの関数は python モードでコンパイルすることです。これにより、ndarray.sort() などのサポートされていない関数や、新しい配列を作成して返す numpy.arange() などの関数を使用できるようになりますが、高速コンパイル ループは維持されます (ndarray.sort() を呼び出さない限り)。またはループ内で numpy.arange() を使用しますが、パフォーマンスが大きな懸念事項である場合は、とにかくそれを実行したくないでしょう)。

要約すると、ループ内で配列をソートしていない限り、numba が nopython モードでの ndarray.sort() の呼び出しを適切にサポートするまで、njit デコレーターの代わりに jit デコレーターを使用して回避できる場合があります。

于 2014-05-29T21:42:50.387 に答える