我有一个非常简单的python例程,其中涉及循环遍历大约20,000个纬度,经度坐标的列表,并计算每个点到参考点的距离。
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
我最初使用完全相同的方法在C中编写了此代码,并且在那儿工作得很好,并且对于nPoints <=
100基本上是瞬时的。所以我决定将其移植到python,因为我想使用SqlAlchemy来做其他事情。
我首先移植了它,但没有现在可以使用该方法的deepcopy语句,这导致结果“奇数”或部分不正确,因为某些要点只是被复制为引用(我猜?我想吗?)-但是它仍然几乎与C版本一样快。
现在添加了deepcopy调用后,该例程可以正确执行其工作,但是却造成了极大的性能损失,并且现在需要几秒钟来完成相同的工作。
这似乎是一项很普通的工作,但是我显然不是以pythonic的方式来做。我应该如何做才能使我仍然获得正确的结果,而不必到处都包含Deepcopy?
编辑:
我已经找到了一个更简单,更快速的解决方案,
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
因此,基本上,我只是复制输入内容并附加一个新值-
距参考点的距离。然后,我仅将“已排序”应用于结果列表,并指定排序键应为PointDistance对象的distance属性。
尽管我承认我不太了解为什么,但这比使用Deepcopy快得多。我想这取决于有效的C实现python的“排序”吗?