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 machen muss und die Berechnung ist ziemlich langsam. Hier ist meine Funktion.Optimierung der Python-Abstandsberechnung unter Berücksichtigung periodischer Randbedingungen
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 die Funktion rufen Sie dann als so
for i, coord2 in enumerate(coordlist):
if (PBCdist(coord1,coord2,UC) < radius):
do something with i
Vor kurzem las ich, dass ich stark durch die Verwendung Liste Verständnis Leistung erhöhen kann. Die folgenden Arbeiten 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 die äquivalent dies für den PBC Fall zu tun? Gibt es eine Alternative, die besser funktioniert?
Sie verwenden NumPy, daher sollten Sie die Schleife vektorisieren, um die Leistung zu verbessern. Was genau ist die Struktur von "Koordinator"? Es sollte ein zweidimensionales NumPy-Array sein, um die Schleife mit NumPy ufuncs optimieren zu können. –
coordlist ist ein numpy Array mit Form ca. (5711,3). Die Koordinatenliste selbst stammt aus einer größeren Liste, so dass ich die Koordinatenkoordinate 20.000 Mal durchlaufen habe und diese Liste der Koordinatenliste etwa 50 mal durchlaufen wird ... Sie erhalten das Bild. – johnjax
Ich habe die Vektorisierungsfunktion in NumPy nachgeschlagen. Die Dokumentation sagt: ["Die Vectorize-Funktion wird hauptsächlich aus Gründen der Zweckmäßigkeit, nicht der Leistung bereitgestellt. Die Implementierung ist im Wesentlichen eine for-Schleife."] (Http://docs.scipy.org/doc/numpy/reference/generated/numpy. vectorize.html) – johnjax