周期的な境界条件を考慮しながら、3D 空間内の 2 点間の距離を計算する 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の場合にこれと同等のことを行う方法はありますか? よりうまく機能する代替手段はありますか?