Python 如何使用嵌套循环改进此代码?
我有一个计算每帧中两点之间碰撞次数的函数。 我不知道如何改进这个非常慢的代码Python 如何使用嵌套循环改进此代码?,python,loops,Python,Loops,我有一个计算每帧中两点之间碰撞次数的函数。 我不知道如何改进这个非常慢的代码 #data example #[[89, 814, -77.1699249744415, 373.870468139648, 0.0], [71, 814, -119.887828826904, 340.433287620544, 0.0]...] def is_collide(data, req_dist): #req_dist - minimum distance wh
#data example
#[[89, 814, -77.1699249744415, 373.870468139648, 0.0], [71, 814, -119.887828826904, 340.433287620544, 0.0]...]
def is_collide(data, req_dist):
#req_dist - minimum distance when collision will be count
temp = data
temp.sort(key=Measurements.sort_by_frame)
max_frame = data[-1][1]
min_frame = data[0][1]
collissions = 0
# max_frame-min_frame approximately 60000
# the slowest part
for i in range(min_frame, max_frame):
frames = [line for line in temp if line[1] == i]
temp = [line for line in temp if line[1] != i]
l = len(frames)
for j in range(0, l, 1):
for k in range(j+1, l, 1):
dist = ((frames[j][2] - frames[k][2])**2 + (frames[j][3]-frames[k][3])**2)**0.5
if dist < req_dist:
collissions += 1
return collissions
计算每对点之间的距离非常昂贵:一个On**2操作。一般来说,即使对于小n来说,这也可能非常昂贵 我建议退一步,看看是否有更好的数据结构可以做到这一点: 四叉树:查看维基百科关于四叉树的文章。这些可能用于碰撞检测。 在乔恩·本特利(Jon Bentley)的书《编程珍珠》(Programming Pearls)第2节第5列中,这一点非常相关。他描述了计算N体问题中类似问题所需的所有优化。我强烈建议你读这本书来了解一些想法。 话虽如此,我认为有些地方你可以做一些相当简单的改进,并得到一些适度的加速 1用平方根进行幂运算的距离计算实际上是一个昂贵的运算。 2你用n**2来计算一个平方,而把n乘以它本身可能会更快 你可以用一个temp来代替它,然后再乘以它本身,但更好的是:你不需要它!只要不使用**.5,所有距离的计算方法都相同,就可以进行比较。换句话说,只要只需要相对值,就可以在不使用sqrt操作的情况下比较距离。我在这里回答了一个类似的问题:
希望这有帮助 它没有错误,您只想提高性能,对吗?您能提供一个最小的可验证示例,其中包含数据、预期输入和输出的简短示例吗?当您临时排序时,您正在修改数据。FYI可能是一个更合适的地方,可以询问请求区的值是什么?