3

私はPythonに比較的慣れていないので、この関数を最適化して高速化するためのアイデアに興味があります。私が行っている数値計算では、これを数万回と呼ぶ必要があり、コード全体の計算時間の大部分を占めます。私はこれをcで書いていますが、特にPythonでより高速に実行するためのトリックを知りたいと思っています。

このコードは、 http://en.wikipedia.org/wiki/Stereographic_projectionに従って、bigD-lengthベクトルからlittleD-lengthベクトルへの立体投影を計算します。変数aは、長さが約96のnumpy配列です。

import numpy as np 
def nsphere(a):
    bigD = len(a)
    littleD = 3
    temp = a
# normalize before calculating projection
    temp = temp/np.sqrt(np.dot(temp,temp))
# calculate projection
    for i in xrange(bigD-littleD + 2,2,-1 ):
        temp = temp[0:-1]/(1.0 - temp[-1])
    return temp
#USAGE:
q = np.random.rand(96)
b = nsphere(q)
print b
4

1 に答える 1

2

これはより速くなるはずです:

def nsphere(a, littleD=3):
    a = a / np.sqrt(np.dot(a, a))
    z = a[littleD:].sum()
    return a[:littleD] / (1. - z)

これが実際に反復アルゴリズムと同じであることを再確認するために、計算を行ってください。

明らかに、ここでの主な高速化は、これが射影を計算するための O(n**2) アルゴリズムを置き換える O(n) アルゴリズムであるという事実からもたらされます。しかし、特にPythonで高速化するには、「内部ループをベクトル化」する必要があります。つまり、コードの最もパフォーマンスが重要な部分で高い python オーバーヘッドが発生するループやその他のものを回避し、代わりに、高度に最適化された python および numpy 組み込みを使用してみてください。それが役立つことを願っています。

于 2012-11-25T07:58:08.710 に答える