0

2つの行列の要素ごとの合計である、アプリケーションのボトルネックを解決しようとしています。

NumPyとCythonを使用しています。cdef行列属性を持つクラスがあります。Cythonはまだクラス属性のバッファー配列をサポートしていないので、これに従いdataマトリックスの属性へのポインターを使用しようとしました。結果が示すように、私は何か間違ったことをしていると確信しています。

私がやろうとしたことは、多かれ少なかれ次のとおりです。

cdef class the_class:
    cdef np.ndarray the_matrix
    cdef float_t* the_matrix_p

    def __init__(self):
        the_matrix_p = <float_t*> self.the_matrix.data

    cpdef the_function(self):
        other_matrix = self.get_other_matrix()


        the_matrix_p += other_matrix.data
4

2 に答える 2

1

2つのnumpy配列を追加することが、Cでの書き換えを解決できるボトルネックであることに深刻な疑問があります。次のコードを参照してくださいscipy.weave

import numpy as np
from scipy.weave import inline

a = np.random.rand(10000000)
b = np.random.rand(10000000)
c = np.empty((10000000,))

def c_sum(a, b, c) :
    length = a.shape[0]
    code = '''
           for(int j = 0; j < length; j++)
           {
               c[j] = a[j] + b[j];
           }
           '''
    inline(code, ['a', 'b', 'c', 'length'])

c_sum(a, b, c)Cコードをコンパイルするために一度実行すると、次のタイミングが得られます。

In [12]: %timeit c_sum(a, b, c)
10 loops, best of 3: 33.5 ms per loop

In [16]: %timeit np.add(a, b, out=c)
10 loops, best of 3: 33.6 ms per loop

したがって、タイミングの違いが単なるランダムノイズではない場合、1,000万個の要素の配列で作業するときに数ミリ秒かかる操作で、パフォーマンスが.3%向上することを確認しているようです。それが本当にボトルネックである場合、これで解決することはほとんどありません。

于 2013-01-25T18:00:37.623 に答える
0

ATLASをコンパイルし、その後numpyを再コンパイルしてみてください。これはおそらく加算には役立ちませんが、より複雑な行列演算を使用すると、パフォーマンスを大幅に向上させることができます(もちろん、これを使用する場合)。

この単純なベンチマークを確認してください。結果が投稿に記載されている結果から大きく外れている場合は、numpyが最適化されたBLAS実装にリンクされていない可能性があります。

于 2013-01-28T00:33:02.657 に答える