Как можно оптимизировать данный код, чтобы он затрачивал меньше времени
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 шт):
у меня где-то был золотой гвоздь для вбивания в голову за такой код без комментариев и т.д. (золотой - за усилие в написании кода) :)
поехали:
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 параметров тут, то валится, поэтому предварительно напишите пользователю что вы от него ожидаете
- не мучайте лишний раз цикл - если вы после цикла ничего нет, то вместо
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')