我已經編寫了一個Python腳本來計算三維空間中兩個點之間的距離,同時考慮了週期邊界條件。問題是我需要對許多點進行計算,計算速度很慢。這是我的功能。在考慮週期邊界條件的同時優化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
是否有某種方式來做到這對中國人民銀行情況相同呢?有沒有更好的替代方案?
您正在使用NumPy,因此您應該引導循環以提高性能。 「coordlist」的結構究竟是什麼?它應該是一個二維NumPy數組,以便能夠使用NumPy ufuncs優化循環。 –
coordlist是一個形狀約爲(5711,3)的numpy數組。 coordlist本身來自一個更大的列表,所以我有效地循環了coordlist 20,000次,並且coordlist的列表循環了大約50次......你得到了圖片。 – johnjax
我查閱了NumPy中的矢量化函數。該文檔說:[「矢量化函數主要是爲了方便,而不是爲了性能。該實現本質上是一個for循環。」](http://docs.scipy.org/doc/numpy/reference/generated/numpy。 vectorize.html) – johnjax