Python—有效地将列表中的每一项与其他每一项进行检查

Python—有效地将列表中的每一项与其他每一项进行检查,python,python-3.x,list,for-loop,Python,Python 3.x,List,For Loop,我正在做一个游戏,每个物体都应该检查它是否与其他物体碰撞。我有一个所有对象的单一列表和一个函数,可以确定两个对象是否碰撞并破坏它们。我目前使用的方法效率很低 for i in list1: for j in list1: if collide(i, j): i.kill() j.kill() 最初,我在杀死这两个对象后从列表中删除了它们,但在没有检测到的情况下发生了一些冲突,所以我返回到这段代码。它可以工作,但我想要更高效

我正在做一个游戏,每个物体都应该检查它是否与其他物体碰撞。我有一个所有对象的单一列表和一个函数,可以确定两个对象是否碰撞并破坏它们。我目前使用的方法效率很低

for i in list1:
    for j in list1:
        if collide(i, j):
            i.kill()
            j.kill()

最初,我在杀死这两个对象后从列表中删除了它们,但在没有检测到的情况下发生了一些冲突,所以我返回到这段代码。它可以工作,但我想要更高效的东西。

首先,这是测试两次太多,并且还测试一个对象是否与自身碰撞:

for i in list1:
    for j in list1:
        if collide(i, j):
            i.kill()
            j.kill()
for i in list1:
    for j in list1:
        if collide(i, j):
            i.kill()
            j.kill()
这个循环正好
len(列表1)**2次

将测试数除以2的一种非常简单的方法(并避免针对自身进行测试):

它利用了
collide(obj1,obj2)
collide(obj2,obj1)
相同的事实

此时,您可能希望中断内部循环,因为obj1现在已失效。但这取决于你想做什么


如果一个精确的碰撞测试是昂贵的,你可以考虑一个更粗糙的检查(距离,矩形边界,任何快速方法),这样你就可以在不进行“昂贵”测试的情况下丢弃彼此太远的物品。如果是这样,则有更好的碰撞检测。请详细说明您使用的数据类型和环境。@zacharybys所有对象始终处于运动状态。该游戏涉及一个重力模型,小行星总是处于重力加速度下。@RoryDaulton它在pygame中,但所有精灵都是圆的,因此内置的rect碰撞将不起作用。因此,这是检查第一项与所有项目的关系,第二项与第一项以外的所有项目的关系,第三项与前两项以外的所有项目的关系,依此类推?是,没错

collide(obj1,obj2)
collide(obj2,obj1)
相同,这就是它效率如此低下的原因。谢谢你的帮助,我会标记它。它仍然有O(n**2)的复杂性,但至少是两倍的速度。这是对每个项目检查一次的最快方法,还是可以提高效率?