1

次のボトルネックがあり、それを高速化する方法を誰かが提案できるかどうか疑問に思っています。

x,y,zlength の3 つのリストがありますNそして、次の合計を適用します。

def abs_val_diff(x1, x2, x3, y1, y2, y3):
    """ Find the absolute value of the difference between x and y """
    return py.sqrt((x1 - y1) ** 2.0 + (x2 - y2) ** 2.0 + (x3 - y3) ** 2.0)

R = 0.1  
sumV = 0.0
for i in xrange(N):
    for j in xrange(i + 1, N):
        if R > abs_val_diff(x[i], y[i], z[i],
                            x[j], y[j], z[j]):
                sumV += 1.0

numpy 配列を使用してみましたが、何か間違っているか、速度が約 2 分の 1 に低下しています。

どんなアイデアでも大歓迎です。

4

3 に答える 3

2

関数で実際に平方根を取る必要がある理由はありますか? 結果を制限と比較するだけなら、比較の両側を二乗しないのはなぜですか?

def abs_val_diff_squared(x1, x2, x3, y1, y2, y3):
    """ Find the square of the absolute value of the difference between x and y """
    return (x1 - y1) ** 2.0 + (x2 - y2) ** 2.0 + (x3 - y3) ** 2.0

R = 0.1
R_squared = R * R
sumV = 0.0
for i in xrange(N):
    for j in xrange(i + 1, N):
        if R_squared > abs_val_diff_squared(x[i], y[i], z[i],
                            x[j], y[j], z[j]):
                sumV += 1.0

また、データを octtree のようなものに並べ替えることで、はるかに大きな節約が得られるはずなので、すべてをすべてと比較するのではなく、近くのポイントを見るだけでよいと思いますが、それは私の知る範囲外です。

于 2013-06-21T14:08:48.597 に答える