Как вы одновременно запускаете 4 оператора if в python? - PullRequest
0 голосов
/ 24 марта 2020

Кто-нибудь знает, как запустить два оператора if одновременно в python?

for i in range(160):

    luca.speed = 1
    if luca.pos() > nick.pos() and luca.pos() > bob.pos():
        luca.backward(luca.speed + 2)
    if luca.pos() < nick.pos() and luca.pos() < bob.pos():
        luca.forward(luca.speed + 3)

    nick.speed = 1
    if luca.pos() > nick.pos() and bob.pos() > nick.pos():
        nick.forward(nick.speed + 8.5)
    if luca.pos() < nick.pos() and bob.pos() < nick.pos():
        nick.forward(nick.speed)

Я пытаюсь сделать эти 4, если операторы выполняются одновременно, а не один за другим .

Ответы [ 3 ]

0 голосов
/ 24 марта 2020

Если я вас правильно понимаю, вы на самом деле не хотите выполнять эти операторы параллельно (4 инструкции за раз), а вместо этого вам нужна единая оценка вместо 4-х доказательств, верно?

Прямо сейчас вы и в лучшем, и в худшем случае запустите 4, если у каждого 2 сравнения, поэтому каждый раз по 8 операций. Попробуем рефакторинг кода - необходимо допустить, что либо luca.pos никогда не равняется nick.pos, либо мы можем заменить> на> =:

luca.speed = 1
nick.speed = 1
if luca.pos() >= nick.pos():
  if luca.pos() > bob.pos():
    luca.backward(luca.speed + 2)
  if bob.pos() > nick.pos():
    nick.forward(nick.speed + 8.5)
else:
  if luca.pos() < bob.pos():
    luca.forward(luca.speed + 3)
  if bob.pos() < nick.pos():
    nick.forward(nick.speed)

Это 3 операции как в лучшем, так и в худшем случае случай.

0 голосов
/ 24 марта 2020

Это было бы намного проще (и понятнее), если отделить определение позиции от действий перемещения с использованием временных переменных:

for i in range(160):

    lucaAhead = luca.pos() > nick.pos() and luca.pos() > bob.pos()
    lucaBack  = luca.pos() < nick.pos() and luca.pos() < bob.pos()
    nickBack  = luca.pos() > nick.pos() and bob.pos() > nick.pos()
    nickAhead = luca.pos() < nick.pos() and bob.pos() < nick.pos()

    luca.speed = 1
    if lucaAhead:
        luca.backward(luca.speed + 2)
    if lucaBack:
        luca.forward(luca.speed + 3)

    nick.speed = 1
    if nickBack:
        nick.forward(nick.speed + 8.5)
    if nickAhead:
        nick.forward(nick.speed)

Кажется также, что существует несоответствие в направлении движения между Люка и Ник (Люка движется назад, когда впереди, но Ник все еще идет вперед). В вопросе недостаточно информации, чтобы определить, является ли это намеренным или случайным

0 голосов
/ 24 марта 2020

Что именно вы подразумеваете под одновременно .

1.) Python (реализация по умолчанию python) использует GIL (глобальная блокировка интерпретатора), поэтому вы никогда не будете выполнять два оператора python на нескольких процессорах одновременно.

Таким образом, производительность не принесет никакой пользы.

Если вы просто имеете в виду, что первый Если оператор может изменить значения из оператора if и, таким образом, сделать вторую проверку ложной, тогда будет достаточно простого кэширования значений, которое вы используете в выражении if.

for i in range(160):

    luca.speed = 1
    luca_pos = luca.pos()
    nic_pos = nic.pos()
    bob_pos = bob.pos()
    if luca_pos > nick_pos and luca_pos > bob_pos:
        luca.backward(luca.speed + 2)
    if luca_pos < nick_pos and luca_pos < bob_pos:
        luca.forward(luca.speed + 3)

    nick.speed = 1
    if luca_pos > nick_pos and bob_pos > nick_pos:
        nick.forward(nick.speed + 8.5)
    if luca_pos < nick_pos and bob_pos < nick_pos:
        nick.forward(nick.speed)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...