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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage