Как ускорить скрипт?

При прохождение теста, 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 шт):

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

Если говорить про скорость.

Соберите все свои единички-нолики в единую строку, а после окончания цикла запишите эту строку в файл одной-единственной операцией.

А вот что такое "верхняя" и "Нижняя" строка - непонятно.

Кстати, вот это условие - "сумма из двух чисел равная значению верхней (5), то в файл записать 1, иначе 0." у вас вообще никак не отрабатывается.

Так что исправляйте проблемы с логикой, потом - со скоростью - потом будем смотреть дальше.

P.S. Даже после ваших корректировок ваш код не соответствует заданию в тойт формулировке, которую вы-же и привели.

→ Ссылка
Автор решения: gil9red

Вместо двойного цикла можно использовать 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()
→ Ссылка
Автор решения: splash58

на 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
→ Ссылка