大家好,又见面了,我是你们的朋友全栈君。
我有一个非常简单的python例程,它涉及循环遍历大约20000个纬度、经度坐标的列表,并计算每个点到参考点的距离。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调用的增加,这个例程正确地完成了它的工作,但是它已经产生了一个极端的性能损失,现在需要几秒钟来完成相同的工作。
这似乎是一项很普通的工作,但我显然不是像Python一样。我应该怎么做才能得到正确的结果,但不必在任何地方都包含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
所以基本上我只是复制输入并附加一个新的值-到参考点的距离。然后我只对结果列表应用“sorted”,指定sort键应该是PointDistance对象的distance属性。
这比使用deepcopy快得多,尽管我承认我不太明白为什么。我想这要归功于python的高效C实现“排序”?
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/188624.html原文链接:https://javaforall.cn