3

numba を使用して np.take を高速化することは可能ですか?

ここに私の試みがありますが、それはずっと遅いです。np.empty_like コマンドが気に入らないため、nopython モードは使用できません。

import numba
import numpy as np
from timer import Timer    

def take( x, indices ):
    result = np.empty_like( indices, dtype=x.dtype )    
    for i in range( len( indices ) ):
        result[i] = x[ indices[ i ] ]
    return result

jtake = numba.jit("f4[:](f4[:],i4[:])" )( take )

if __name__=='__main__':

    N = 100000
    m = 100
    idx = np.random.random_integers( 0, N, m )
    x = np.random.randn( N )

    num_tests=10000

    with Timer( 'take' ):
        for i in range( num_tests ):    
            r0 = take( x, idx )

    with Timer( 'Numba take' ):
        for i in range( num_tests ):    
            r1 = jtake( x, idx )                

    with Timer( 'Numpy.take' ):
        for i in range( num_tests ):
            r2 = x.take( idx )

結果は次のとおりです。

Beginning take
take took 2.46 seconds
Beginning Numba take
Numba take took 1.11 seconds
Beginning Numpy.take
Numpy.take took 0.04 seconds
4

1 に答える 1

2

答えはノーだ。

np.take()Numba は、アルゴリズムの基礎となるファンシー インデックスで動作する や配列メソッドなどのコンパイル済み関数には作用しません。Numba は、コードの解釈された部分に作用します。

あなたのtake()関数はおそらく NumPy よりも多くのオーバーヘッドがあり、Numba は for ループを改善しました (解釈済み)。

NumPy > 1.9 では、アルゴリズムがファンシー インデックス作成に基づいており、ファンシー インデックス作成の効率が のレベルまで改善されているため、コードは NumPy のテイクに近づくはずですnp.take()

于 2014-11-14T14:37:20.477 に答える