Как ускорить скрипт?
При прохождение теста, 1 из тестов не срабатывает из за превышение лимита, либо ошибки в коде.
Суть задания если в нижней строке из файла text.txt (1 7 3 4 7 9) есть сумма из двух чисел равная значению верхней (5), то в файл записать 1, иначе 0.
import os
def main():
f = open('text.txt', 'r').read().split()
w = open('text2.txt', 'r+')
target = int(f[0])
l = [int(f[i]) for i in range(1, len(f))]
l.sort()
print(l)
# Как ускорить данный участок кода
for i in range(len(l)):
for j in range(len(l) - 1):
if l[i] + l[j + 1] == target:
w.write('1')
return
#
if os.stat('text2.txt').st_size == 0:
w.write('0')
if __name__ == "__main__":
main()
Содержание файла text.txt:
```
5
1 7 3 4 7 9
```
Воспользовался всеми советами, в итоге на 1 тест прошел больше, но другой тест так же выходит за заданное время в 1 сек (1.091s). К сожалению, нет примерных данных с того теста. Спасиб всем кто помог с поиском решения.
import itertools
def fun(target, nums):
for x in nums[:-1]:
for y in nums[x+1:] :
if x+y == target :
return True
return False
def main():
with open('text.txt') as f:
target, l = f.readlines()
target = int(target)
l = [int(i) for i in l.split() if target >= int(i)]
l.sort()
print(l)
flag = fun(target, l)
with open('text2.txt', 'w') as f:
f.write('1' if flag else '0')
if __name__ == "__main__":
main()
Ответы (3 шт):
Если говорить про скорость.
Соберите все свои единички-нолики в единую строку, а после окончания цикла запишите эту строку в файл одной-единственной операцией.
А вот что такое "верхняя" и "Нижняя" строка - непонятно.
Кстати, вот это условие - "сумма из двух чисел равная значению верхней (5), то в файл записать 1, иначе 0." у вас вообще никак не отрабатывается.
Так что исправляйте проблемы с логикой, потом - со скоростью - потом будем смотреть дальше.
P.S. Даже после ваших корректировок ваш код не соответствует заданию в тойт формулировке, которую вы-же и привели.
Вместо двойного цикла можно использовать itertools.combinations, скорость работы увеличится на ~40%
Пример теста скорости:
import itertools
def has_1(target: int, nums: list) -> bool:
for i in range(len(nums)):
for j in range(len(nums) - 1):
if nums[i] + nums[j + 1] == target:
return True
return False
def has_2(target: int, nums: list) -> bool:
for a, b in itertools.combinations(nums, 2):
if a + b == target:
return True
return False
target = 5
nums = [1, 3, 4, 7, 7, 9]
import timeit
print(
timeit.timeit('has_1(target, nums)', globals=globals())
)
# 0.7132318
print(
timeit.timeit('has_2(target, nums)', globals=globals())
)
# 0.3819617999999999
PS.
Использование itertools в коде из вопроса с небольшим рефакторингом:
import itertools
def main():
with open('text.txt') as f:
target, nums = f.readlines()
target = int(target)
nums = [int(i) for i in nums.split()]
nums.sort()
result = False
for a, b in itertools.combinations(nums, 2):
if a + b == target:
result = True
break
with open('text2.txt', 'w') as f:
f.write('1' if result else '0')
if __name__ == "__main__":
main()
на 20 % быстрее ответа @gil9red :) на моем ноуте timeit дает (последний код ниже)
1.1719330577166354
0.6272641881987562
0.5278181732993907
def f( target, nums ):
for x in nums[:-1]:
for y in nums[x+1:] :
if x+y == target :
return True
return False