2

Pythonで3Dレンダリングを試しています。Pythonはとても遅いと読み続けています!シェーダーでは実行できないすべてのマトリックスの処理に、NumpyのCの素晴らしさを利用する必要があります。そうでなければ、何も機能しません、yadda、yadda(ここで言い換えます..)。

しかし:私はいくつかのテストをしました!

これは、Numpyフレーバーのランダム行列です。

matrix1 = numpy.matrix([[1, 1, 0, 0,], [0, 1, 0, 0], [0, 0, 1, 1], [0, 0, 0, 1]])
>>> matrix([[1, 1, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 1, 1],
            [0, 0, 0, 1]])

そして、かつては沼地の標準的なタプルとして:

matrix2 = (1, 1, 0, 0,\
      0, 1, 0, 0,\
      0, 0, 1, 1,\
      0, 0, 0, 1)

さて、その逆が必要な場合は、Numpyで実行できます。

def inv_1():
    return matrix1.I

または純粋なPythonとして(頭が痛いので数学の一部を省略しました):

def inv_2():
    m0, m1, m2, m3, \
    m4, m5, m6, m7, \
    m8, m9, m10, m11, \
    m12, m13, m14, m15 = matrix2

    A0 = (( m0 *  m5) - ( m1 *  m4))  ....
 ...B5 = ((m10 * m15) - (m11 * m14))

    det = 1.0 / det
    return (
        (+ ( m5 * B5) - ( m6 * B4) + ( m7 * B3)) * det, ...
     ...(+ ( m8 * A3) - ( m9 * A1) + (m10 * A0)) * det
    )

どちらも正常に機能します。

inv_1()
>>>> matrix([[ 1., -1.,  0.,  0.],
             [ 0.,  1.,  0.,  0.],
             [ 0.,  0.,  1., -1.],
             [ 0.,  0.,  0.,  1.]])

inv_2()
>>>> (1.0, -1.0, 0.0, 0.0, 
      0.0, 1.0, 0.0, 0.0, 
      0.0, 0.0, 1.0, -1.0,
      0.0, 0.0, 0.0, 1.0)   (I added the line-breaks here for clarity)

しかし、純粋なPythonコードは、高く評価されているNumpyよりも一貫して約10倍高速に実行されます。

timeit.timeit(inv_1, number=100000)
>>>> 3.0659120082855225

timeit.timeit(inv_2, number=100000)
>>>> 0.4014430046081543

そして、私の美しいタプル行列をNumpy行列に変換するオーバーヘッドを追加すると、さらに遅くなります。

では、ここで何が起こっているのでしょうか。私は何か間違ったことをしていますか?それはすべて、C関数を呼び出すオーバーヘッドによるものですか?私が盗んだ反転コードの男は物理法則を破ったのでしょうか?

私を非難してくれてありがとう!愛してるよ!

4

1 に答える 1

7

マトリックスを分析的に反転しています(これは、寸法がわかっていて、大きすぎないために可能です)。numpyは、行列が4x4および10000x10000の場合に機能する、他の(数値)アルゴリズムを使用して行列を反転する必要があります。言い換えれば、一般的な問題は、あなたが持っている単純な4x4の場合よりもはるかに難しいです。

于 2012-10-12T17:41:49.080 に答える