私は大きな2D NumPy配列を持っています.5M行と10個の列としましょう。 Numba @jitclass
を使用して実装されたステートフルなロジックに従っていくつかの列を作成したいと思います。新しい列を50個作成するとします。この考え方は、Numba @jit
関数の10列のすべての行を繰り返し処理することで、各行に対して、それぞれ50個の「フィルタ」を適用してそれぞれ1つの新しいセルを生成します。だから、:Numbaを使って各行に複数の関数を適用する
Source1..Source10 Derived1..Derived50
[array of 10 inputs] [array of 50 outputs]
... 5 million rows like this ...
問題は、彼らが均質ではないので、私は、@jit(nopython=True)
関数に私の「フィルタ」のリストやタプルを渡すことはできません、次のとおりです。上記
@numba.jit(nopython=True)
def calc_derived(source, derived, filters):
for srcidx, src in enumerate(source):
for filtidx, filt in enumerate(filters): # doesn't work
derived[srcidx,filtidx] = filt.transform(src)
はしていませんfilters
はさまざまなクラスの束であるために動作します。私が知る限り、それらを共通の基底クラスから派生させても十分ではありません。
ループの順番を入れ替える可能性が残っていますが、@jit
関数の外にある50個のフィルタにループを適用しても、ソースデータセット全体が1回ではなく50回ロードされることになります。非常に無駄です。
Numbaの「同種リストのみ」の要件を回避するテクニックはありますか?
私はこれを素早く見ていて、問題の内容をうまく解決できませんでした。 'source'と' filters'の列挙は、10要素または50要素しかないので、すばやくすべきです。しかし、 'src'は5M要素なので、実際の作業は' filt.transform'(正しく理解すれば)によって行われます。したがって、私は外側のループをどのように変更したかを説明するテストケースを思いつきました.- filt.transformは最適化されています... – DavidW