Как можно оптимизировать данный код, чтобы он затрачивал меньше времени

def explosion():
    args = list(map(int, input().split()))
    connect = []
    cross = []
    chk = 0
    for i in range(args[1]):
        connect.append(list(map(int, input().split())))
    for i in range(len(connect)):
        if connect[i][0] == 1:
            if connect[i][1] == args[0] or connect[i][1] == connect[i][0]+1:
                pass
            else:
                cross.append(connect[i])
        else:
            if connect[i][0] == connect[i][1] - 1 or connect[i][0] == connect[i][1] + 1:
                pass
            else:
                cross.append(connect[i])
    for i in range(1, len(cross)):
        for j in range(len(cross)-1):
            if sum(cross[j]) - sum(cross[i]) > 1 or sum(cross[j]) - sum(cross[i]) < -1:
                print('Unsafe')
                chk = 1
                break
    if chk == 0:
        print('Safe')

explosion()

Ответы (1 шт):

Автор решения: Zhihar

у меня где-то был золотой гвоздь для вбивания в голову за такой код без комментариев и т.д. (золотой - за усилие в написании кода) :)

поехали:

1)

if sum(cross[j]) - sum(cross[i]) > 1 or sum(cross[j]) - sum(cross[i]) < -1

т.е. требуется определить превосходит ли сумма по модулю 1 можно сделать в 1 проверку:

delta = sum(cross[j]) - sum(cross[i])

if delta * delta > 1

математически это одно и тоже но зато проверка одна только что должно ускорять код

2.

зачем проверки которые ничего не делают

if connect[i][1] == args[0] or connect[i][1] == connect[i][0] + 1:
    pass
else:
    cross.append(connect[i])

лучше писать сразу

if connect[i][1] != args[0] and connect[i][1] != connect[i][0] + 1:
    cross.append(connect[i])

на скорость это скорее всего не повлияет (и то не факт), а вот на чтение кода - да

3.

Если вначале требуется ввести 2 аргумента, так и запросите 2 аргумента:

Т.е. вместо

args = list(map(int, input().split()))

Лучше

count, value = list(map(int, input().split()))

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

  1. не мучайте лишний раз цикл - если вы после цикла ничего нет, то вместо break можно сразу вываливаться из цикла, а заодно не плодите лишних переменных, если их можно не использовать

Поэтому

for i in range(1, len(cross)):
    for j in range(len(cross)-1):
        if sum(cross[j]) - sum(cross[i]) > 1 or sum(cross[j]) - sum(cross[i]) < -1:
            print('Unsafe')
            chk = 1
            break
if chk == 0:
    print('Safe')

минимум можно превратить в:

chk = 0
for i in range(1, len(cross)):
    for j in range(len(cross)-1):
        delta = sum(cross[j]) - sum(cross[i])
        if delta * delta > 1:
            chk = 1
            break

print(chk ? 'Unsafe' : 'Safe')

а лучше в:

for i in range(1, len(cross)):
    for j in range(len(cross)-1):
        delta = sum(cross[j]) - sum(cross[i])
        if delta * delta > 1:
            print('Unsafe')
            return

print('Safe')
→ Ссылка