Tôi có một thói quen python rất đơn giản liên quan đến việc đi xe đạp thông qua danh sách khoảng 20.000 vĩ độ, kinh độ và tính toán khoảng cách của mỗi điểm đến một điểm tham chiếu.deepcopy và python - mẹo để tránh sử dụng nó?
def compute_nearest_points(lat, lon, nPoints=5):
"""Find the nearest N points, given the input coordinates."""
points = session.query(PointIndex).all()
oldNearest = []
newNearest = []
for n in xrange(nPoints):
oldNearest.append(PointDistance(None,None,None,99999.0,99999.0))
newNearest.append(obj2)
#This is almost certainly an inappropriate use of deepcopy
# but how SHOULD I be doing this?!?!
for point in points:
distance = compute_spherical_law_of_cosines(lat, lon, point.avg_lat, point.avg_lon)
k = 0
for p in oldNearest:
if distance < p.distance:
newNearest[k] = PointDistance(
point.point, point.kana, point.english, point.avg_lat, point.avg_lon, distance=distance
)
break
else:
newNearest[k] = deepcopy(oldNearest[k])
k += 1
for j in range(k,nPoints-1):
newNearest[j+1] = deepcopy(oldNearest[j])
oldNearest = deepcopy(newNearest)
#We're done, now print the result
for point in oldNearest:
print point.station, point.english, point.distance
return
ban đầu tôi viết điều này trong C, sử dụng phương pháp chính xác giống nhau, và nó hoạt động tốt ở đó, và về cơ bản là tức thời cho nPoints < = 100. Vì vậy, tôi quyết định chuyển nó sang python vì tôi muốn sử dụng SqlAlchemy để làm một số thứ khác. Lần đầu tiên tôi chuyển nó mà không có các câu lệnh sâu sắc mà bây giờ hạt tiêu phương pháp, và điều này gây ra kết quả là 'lẻ', hoặc một phần không chính xác, bởi vì một số điểm đã được chỉ sao chép như tài liệu tham khảo (tôi đoán? Tôi nghĩ rằng, tôi nghĩ rằng nó không?). ?) - nhưng nó vẫn gần như nhanh như phiên bản C.
Bây giờ với các cuộc gọi sâu hơn được thêm vào, thường trình thực hiện công việc một cách chính xác, nhưng nó đã phát sinh một hình phạt cực kỳ hiệu suất, và bây giờ phải mất vài giây để thực hiện công việc tương tự.
Điều này có vẻ như là một công việc khá phổ biến, nhưng tôi rõ ràng không làm theo cách nhiệt tình. Làm thế nào tôi nên làm điều này để tôi vẫn nhận được kết quả chính xác nhưng không cần phải bao gồm sâu ở khắp mọi nơi?
EDIT:
Tôi đã nhấn vào một giải pháp đơn giản hơn nhiều và nhanh hơn,
def compute_nearest_points2(lat, lon, nPoints=5):
"""Find the nearest N points, given the input coordinates."""
points = session.query(PointIndex).all()
nearest = []
for point in points:
distance = compute_spherical_law_of_cosines(lat, lon, point.avg_lat, point.avg_lon)
nearest.append(
PointDistance(
point.point, point.kana, point.english, point.avg_lat, point.avg_lon, distance=distance
)
)
nearest_points = sorted(nearest, key=lambda point: point.distance)[:nPoints]
for item in nearest_points:
print item.point, item.english, item.distance
return
Vì vậy, về cơ bản tôi chỉ thực hiện một bản sao hoàn chỉnh của đầu vào và phụ thêm một giá trị mới - khoảng cách từ điểm tham khảo. Sau đó, tôi chỉ áp dụng 'sắp xếp' vào danh sách kết quả, xác định rằng phím sắp xếp phải là thuộc tính khoảng cách của đối tượng PointDistance.
Điều này nhanh hơn nhiều so với việc sử dụng bản in sâu mặc dù tôi thú nhận rằng tôi thực sự không hiểu tại sao. Tôi đoán nó là xuống để thực hiện C hiệu quả python của "sắp xếp"?
Lớp 'PointDistance' trông như thế nào? Nếu bạn làm cho lớp 'PointDistance' đơn giản chỉ đề cập đến điểm gốc và khoảng cách của nó (tức là nó là một bộ dữ liệu với hai phần tử), bạn không cần phải sử dụng' deepcopy' vì các điểm sẽ không thay đổi trong thuật toán và khoảng cách là một số đơn giản. –
@ Tamás có nó về cơ bản chỉ là một từ điển. tuy nhiên điều này chắc chắn không hoạt động ngay mà không có bản in sâu trong ví dụ đầu tiên. có lẽ nó sẽ hoạt động nếu tôi chỉ loại bỏ hoàn toàn lớp học và sử dụng một từ điển để thay thế? thành thật mà nói, tôi chỉ không nắm rõ mô hình tham chiếu để biết điều gì sẽ xảy ra trong những trường hợp đó. có lẽ bạn có thể xây dựng hoặc chỉ cho tôi một số tài nguyên hoặc bài đăng khác về chủ đề này? – si28719e