有没有一种方法可以优化多个python循环?

有没有一种方法可以优化多个python循环?,python,loops,for-loop,Python,Loops,For Loop,我正在尝试制作一个多人网络游戏,我有一个用python制作的服务器。由于游戏是多人游戏,我需要分别更新每个玩家;这需要for循环,目前我的代码使用了大量for循环,这给我带来了一些不必要的副作用。副作用包括速度减慢。我对for循环的另一个问题是,它们根据循环的次数改变速度;这导致了一个问题,即循环需要循环通过的项目的数量根据连接的玩家数量而变化,从而打乱了我为掩盖延迟所做的客户端预测函数 这是我的主要代码: PlayerData = {} for Player in Pl

我正在尝试制作一个多人网络游戏,我有一个用python制作的服务器。由于游戏是多人游戏,我需要分别更新每个玩家;这需要
for
循环,目前我的代码使用了大量for循环,这给我带来了一些不必要的副作用。副作用包括速度减慢。我对for循环的另一个问题是,它们根据循环的次数改变速度;这导致了一个问题,即循环需要循环通过的项目的数量根据连接的玩家数量而变化,从而打乱了我为掩盖延迟所做的客户端预测函数

这是我的主要代码:

      PlayerData = {} 

    for Player in Players:
        if(Player.id > 50):
            PlayerData['playerx' + str(Player.id)] = Player.x
            PlayerData['playery' + str(Player.id)] = Player.y


            PlayerData['playera' + str(Player.id)] = int(Player.angle)

            PlayerData['playerstat' + str(Player.id)] = Player.alive

            if(Player.id > 50):
                if(Player.alive == 0):
                    Players.remove(Player) 

        for ID in clientIds:
            PlayerData['id'] = str(clientIds[len(clientIds) - 1].id)

        PlayerData['players'] = ids




        if(Player.id <= 50):
            hrIds.append(Player.id)
            PlayerData['hx' + str(Player.id)] = Player.x
            PlayerData['hy' + str(Player.id)] = Player.y
            #PlayerData['ha' + str(Player.id)] = int(Player.angle)


    PlayerData['hr'] = hrIds
    PlayerJsonData = json.dumps(PlayerData)
    await websocket.send(PlayerJsonData)
    recivedData = await websocket.receive()
    rData = json.loads(recivedData)

    for ID in clientIds:
        if(rData['id'] == str(ID.id)):
            if(ID.IG == 0):
                 if(rData['playerstat'] == 1):
                    Players.append(player_classes.Basic(-1300, -1300, ID.ws, ID.id, 1)) 
                    ID.IG = 1




    for Player in Players:

        for Player2 in Players:
             if(Player.id > 50):
                Player.detect_collide(Player2)


                if(rData['id'] == str(Player.id)):
                    if(rData['direction'] == "up"):
                            Player.accelerate(rData['direction'])
                            Player.moveUp(Player2)

                    if(rData['direction'] == "left"):
                        Player.accelerate(rData['direction'])
                        Player.moveLeft(Player2)

                    if(rData['direction'] == "down"):
                        Player.accelerate(rData['direction'])
                        Player.moveDown(Player2)

                    if(rData['direction'] == "right"):
                        Player.accelerate(rData['direction'])
                        Player.moveRight(Player2)


                    if(rData['direction'] == "none"):
                        Player.decelerate(rData['direction'])  
PlayerData={}
对于玩家中的玩家:
如果(Player.id>50):
PlayerData['playerx'+str(Player.id)]=Player.x
PlayerData['playery'+str(Player.id)]=Player.y
PlayerData['playera'+str(Player.id)]=int(Player.angle)
PlayerData['playerstat'+str(Player.id)]=Player.live
如果(Player.id>50):
如果(Player.alive==0):
玩家。移除(玩家)
对于ClientID中的ID:
PlayerData['id']=str(clientId[len(clientId)-1].id)
PlayerData['players']=id
如果(玩家id 50):
玩家。检测碰撞(玩家2)
如果(rData['id']==str(Player.id)):
如果(rData['direction']=“up”):
玩家加速(rData[“方向])
玩家移动(玩家2)
如果(rData['direction']=“left”):
玩家加速(rData[“方向])
玩家。向左移动(玩家2)
如果(rData['direction']=“down”):
玩家加速(rData[“方向])
球员下移(球员2)
如果(rData['direction']=“right”):
玩家加速(rData[“方向])
玩家。向右移动(玩家2)
如果(rData['direction']=“none”):
玩家减速(rData[“方向])

编辑:我的主要循环速度问题发生在我向
玩家添加更多类时。你应该避免两次检查同一对玩家的碰撞

让我们举一个非常简单的例子,使用包含0、1、2、3的
Players
列表

通过您的代码,您可以获得大量冗余测试:

  • 在循环0中,将0与1、2和3进行测试
  • 在循环1中,您针对0、2和3测试1==>(但0-1已经测试过)
  • 在循环2中,您针对0、1和3对2进行测试==>(但是0-2/1-2已经过测试)
  • 在循环3中,您针对0、1和2对3进行测试==>(但是0-3/1-3/2-3已经过测试)
因此,不是:

for Player in Players:
    for Player2 in Players:
做:

如果再次使用包含0、1、2、3的列表,则会出现以下行为:

  • 在循环0中,您将0与1、2、3进行测试
  • 在循环1,你测试1对2,3
  • 在循环2,你测试2对3

这样,它将迭代次数从N^2减少到N(N-1)/2。

第二对嵌套for循环看起来是多余的,除非它是一个打字错误
对于玩家中的玩家
然后
对于玩家中的玩家2
迭代玩家n^2次?这不是打字错误,其目的是
检测碰撞
需要比较两个玩家的碰撞。这似乎对我不起作用,检测碰撞功能需要比较游戏中的所有玩家。可以这样认为,如果选择了一个玩家,那么需要将该玩家与所有其他玩家进行比较。不,您在代码中对同一对玩家进行了两次冗余测试,而我的代码将对每个玩家对进行一次测试。我已经更新了我的答案,为您提供了更好的解释。我尝试过,但由于某些原因,检测碰撞不会被触发。
Players
是列表吗?上面的代码假定它是一个列表。如果没有,您应该调整代码使其可索引。那么您的意思是
detect\u collide
甚至不运行一次?那一定是代码中的其他内容。在一个小测试片段中单独尝试我的循环,您将看到它是如何工作的。
for i, Player in enumerate(Players):
    for Player2 in Players[i + 1:]: