定期的な境界条件を考慮しながら、3D空間内の2点間の距離を計算するPythonスクリプトを作成しました。問題は、多くの点でこの計算を行う必要があり、計算が非常に遅いことです。ここに私の機能があります。定期的な境界条件を考慮しながらPython距離計算を最適化する
def PBCdist(coord1,coord2,UC):
dx = coord1[0] - coord2[0]
if (abs(dx) > UC[0]*0.5):
dx = UC[0] - dx
dy = coord1[1] - coord2[1]
if (abs(dy) > UC[1]*0.5):
dy = UC[1] - dy
dz = coord1[2] - coord2[2]
if (abs(dz) > UC[2]*0.5):
dz = UC[2] - dz
dist = np.sqrt(dx**2 + dy**2 + dz**2)
return dist
ので
for i, coord2 in enumerate(coordlist):
if (PBCdist(coord1,coord2,UC) < radius):
do something with i
最近、私は非常にリストの内包表記を使用してパフォーマンスを向上させることができることを読んで、私は、関数を呼び出します。非PBCケースについて、次の作品ではなく、PBC場合
coord_indices = [i for i, y in enumerate([np.sqrt(np.sum((coord2-coord1)**2)) for coord2 in coordlist]) if y < radius]
for i in coord_indices:
do something
PBC場合は、この相当を行うにはいくつかの方法がありますか?より良い選択肢がありますか?
NumPyを使用しているため、パフォーマンスを向上させるためにループをベクトル化する必要があります。 'coordlist'の構造はどういうものですか? NumPy ufuncsでループを最適化できるようにするには、2次元のNumPy配列でなければなりません。 –
coordlistは、形状が約(5711,3)のnumpy配列です。 coordlist自体は大きなリストから来ているので、私は実際にcoordlistを20,000回ループし、coordlistのリストは約50回にわたってループします。あなたは画像を取得します。 – johnjax
私はNumPyでベクトル化関数を調べました。ドキュメンテーションには次のように書かれています:["vectorize関数は、主に便宜のために提供されているものであり、パフォーマンスのためではありません。 vectorize.html) – johnjax