Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用嵌套循环改进此代码?_Python_Loops - Fatal编程技术网

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可能是一个更合适的地方,可以询问请求区的值是什么?