Tôi đã viết một kịch bản Python để tính toán khoảng cách giữa hai điểm trong không gian 3D trong khi tính toán các điều kiện biên định kỳ. Vấn đề là tôi cần thực hiện phép tính này cho nhiều, nhiều điểm và tính toán khá chậm. Đây là chức năng của tôi.Tối ưu hóa tính toán khoảng cách Python trong khi tính toán các điều kiện biên định kỳ
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
sau đó tôi gọi hàm như vậy
for i, coord2 in enumerate(coordlist):
if (PBCdist(coord1,coord2,UC) < radius):
do something with i
Gần đây tôi đọc mà tôi có thể làm tăng đáng kể hiệu suất bằng cách sử dụng danh sách hiểu. Các công trình sau đây không áp dụng cho trường hợp không thuộc PBC, nhưng không áp dụng cho trường hợp 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
Có cách nào để thực hiện tương đương với trường hợp PBC không? Có một giải pháp thay thế nào có hiệu quả hơn không?
Bạn đang sử dụng NumPy, vì vậy bạn nên vectơ vòng lặp để cải thiện hiệu suất. Chính xác cấu trúc của 'coordlist' là gì? Nó phải là mảng NumPy hai chiều để có thể tối ưu hóa vòng lặp với NumPy ufuncs. –
danh sách điều phối là một mảng numpy với hình dạng xấp xỉ (5711,3). bản thân danh sách điều phối đến từ một danh sách lớn hơn, vì vậy tôi có hiệu quả lặp lại trên danh sách điều phối 20.000 lần và danh sách các điều phối viên được lặp lại khoảng 50 lần ... bạn sẽ có được hình ảnh. – johnjax
Tôi đã tra cứu hàm vectơ trong NumPy. Tài liệu nói: ["Chức năng vectơ được cung cấp chủ yếu để thuận tiện, không phải cho hiệu năng. Việc thực hiện về cơ bản là một vòng lặp for."] (Http://docs.scipy.org/doc/numpy/reference/generated/numpy. vectorize.html) – johnjax