python deepcopy函数实现_python 多线程

python deepcopy函数实现_python 多线程我有一个非常简单的python例程,它涉及循环遍历大约20000个纬度、经度坐标的列表,并计算每个点到参考点的距离。defcompute_nearest_points(lat,lon,nPoints=5):”””FindthenearestNpoints,giventheinputcoordinates.”””points=session.query(PointInd…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

我有一个非常简单的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&lt;=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实现“排序”?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188624.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号