Эффективный на Python способ записи вложенного if-else внутри вложенного цикла for - PullRequest
1 голос
/ 24 октября 2019

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

Вот мой код:

mat = [[0] * n] * n
count = 0
for i in range(n,0,-1):
    count += 1
    for j in range(i,n+1,1):
        if i == j:
            pass
        else:
            if getEnemyStatus(mat, i, j):
               break
            else:
                if isEnemy(enemyDict, i, j):
                    setStatus(mat, i, j)
                    break
                else:
                    count += 1

значение n может быть от 1 до 10 ^ 5

1 Ответ

0 голосов
/ 24 октября 2019

Вы можете пропустить первое if condition, начав с i+1 в range

for j in range(i+1, n+1, 1):
   # code here

Во-вторых, следует избегать вложенного условия if else с elif для чтения.

Код обновления должен выглядеть следующим образом:

mat = [[0] * n] * n
count = 0
for i in range(n,0,-1):
    count += 1
    for j in range(i + 1, n + 1, 1):
        if getEnemyStatus(mat, i, j):
            break
        elif isEnemy(enemyDict, i, j):
            setStatus(mat, i, j)
            break
        else:
            count += 1

ПРИМЕЧАНИЕ : Кроме того, если вы можете установить статус setStatus в вашем isEnemy function, вы можете получить большекод уборщика:

mat = [[0] * n] * n
count = 0
for i in range(n,0,-1):
    count += 1
    for j in range(i + 1, n + 1, 1):
        if getEnemyStatus(mat, i, j) or isEnemy(enemyDict, i, j):
            break
        count += 1
...