2

同時発生の最小条件付き確率を計算する関数を高速化するために Numba を試しています。

    import numpy as np
    from numba import double
    from numba.decorators import jit, autojit

    X = np.random.random((100,2))

    def cooccurance_probability(X):
        P = X.shape[1]      
        CS = np.sum(X, axis=0)                  #Column Sums
        D = np.empty((P, P), dtype=np.float)    #Return Matrix
        for i in range(P):
            for j in range(P):
                D[i, j] = (X[:,i] * X[:,j]).sum() / max(CS[i], CS[j])
        return D 

    cooccurance_probability_numba = autojit(cooccurance_probability)

cooccurance_probabilityただし、とのパフォーマンスはcooccurance_probability_numbaほぼ同じであることがわかりました。

%timeit cooccurance_probability(X)
1 loops, best of 3: 302 ms per loop

%timeit cooccurance_probability_numba(X)
1 loops, best of 3: 307 ms per loop

どうしてこれなの?要素操作ごとの派手な要素が原因でしょうか?

私は例として次のとおりです: http://nbviewer.ipython.org/github/ellisonbg/talk-sicm2-2013/blob/master/NumbaCython.ipynb

[注: 問題の対称性により、実行時間を半分にすることができましたが、それは私の主な関心事ではありません]

4

2 に答える 2

3

私の推測では、 への呼び出しのためにネイティブ コードを生成するのではなく、オブジェクト レイヤーにヒットしていると思われますsum。最適化/変換する方法がわからないだけですsum(この時点で)。さらに、ベクトル化された操作を Numba を使用して明示的なループに展開することをお勧めします。リンク先の ipynb は、np.sqrtマシン コードに変換されると思われる呼び出しのみを呼び出し、スライスではなく要素で動作することに注意してください。sumスライスを取得してメソッドを使用するのではなく、要素に対する明示的な追加ループとして、内側のループで合計を展開しようとします。

私の経験では、Numba はときどき驚異的に機能しますが、任意の Python コードを高速化することはできません。制限と、効果的に最適化できるものを理解する必要があります。また、v0.11 は、0.12 および 0.13 と比較して、Numba がこれらのバージョン間で行った主要なリファクタリングにより、この点で少し異なることに注意してください。

于 2014-04-04T05:14:02.197 に答える