Optimierung der Python-Abstandsberechnung unter Berücksichtigung periodischer Randbedingungen
Ich habe ein Python-Skript geschrieben, um den Abstand zwischen zwei Punkten im 3D-Raum unter Berücksichtigung periodischer Randbedingungen zu berechnen. Das Problem ist, dass ich diese Berechnung für viele, viele Punkte durchführen muss und die Berechnung ziemlich langsam ist. Hier ist meine Funktion.
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
Ich rufe dann die Funktion so auf
for i, coord2 in enumerate(coordlist):
if (PBCdist(coord1,coord2,UC) < radius):
do something with i
Kürzlich habe ich gelesen, dass ich die Leistung durch Verwendung des Listenverständnisses erheblich steigern kann. Das Folgende funktioniert für den Nicht-PBC-Fall, aber nicht für den PBC-Fall
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
Gibt es eine Möglichkeit, dies für den PBC-Fall zu tun? Gibt es eine Alternative, die besser funktionieren würde?