Optymalizacja obliczania odległości Pythona przy uwzględnieniu okresowych warunków brzegowych

Napisałem skrypt Pythona, aby obliczyć odległość między dwoma punktami w przestrzeni 3D, uwzględniając okresowe warunki brzegowe. Problem polega na tym, że muszę wykonać te obliczenia dla wielu, wielu punktów, a obliczenia są dość powolne. Oto moja funkcja.

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

Następnie wywołuję funkcję w ten sposób

for i, coord2 in enumerate(coordlist):
  if (PBCdist(coord1,coord2,UC) < radius):
      do something with i

Ostatnio przeczytałem, że mogę znacznie zwiększyć wydajność, używając rozumienia listy. Poniższe działa w przypadku bez PBC, ale nie w przypadku 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

Czy jest jakiś sposób na zrobienie odpowiednika tego w przypadku PBC? Czy istnieje alternatywa, która mogłaby działać lepiej?

questionAnswers(4)

yourAnswerToTheQuestion