Как оптимизировать построчный ввод данных?

Рейтинг: 0Ответов: 1Опубликовано: 08.01.2023

Подается число n (n = 173 528). Это кол-во слов, которые затем подаются построчно.

Пробовал использовать:

input = io.BytesIO(os.read(0, os.fstat(0).st_size)).readline

Еще пробовал тестировать с заранее известными данными и моя программа выдавала ответ менее чем за 2 секунды (то есть вся проблема заключается скорее всего в вводе большого кол-ва данных).

Как можно оптимизировать этот ввод? (Данные с ввода сразу записываю в массив)

Ответы

▲ 4Принят

Думаю что язык - Питон. Напечатаем файл из 200000 длинных целых чисел:

for n in range(10 ** 64, 10 ** 64 + 200000):
    print(n)
$ python make-list.py > in.txt

$ wc in.txt 
  200000   200000 13200000 in.txt

200000 строк, 13Mb.

Теперь прочитаем этот файл медленно. Каждая строки читается отдельно внутри блока try и преобразуется в целое число:

c = 0
while True:
    try:
        n = int(input())
    except EOFError:
        break
    c += 1
print(c)
 $ time python read-list.py < in.txt
200000

real  0m0.321s
user  0m0.280s
sys   0m0.036s

За треть секунды всё прочитано, преобразовано и сосчитано. Ищите причины медлительности вашей программы в другом месте.

Ещё одна попытка. Читаем строки из итератора. Преобразование в целые всё ещё есть:

import sys

c = 0
for line in sys.stdin:
    n = int(line)
    c += 1
print(c)
$ time python read-list.py < in.txt
200000

real  0m0.127s
user  0m0.120s
sys   0m0.004s

Одна восьмая секунды.

Без преобразований:

import sys

c = 0
for line in sys.stdin:
    c += 1
print(c)
$ time py temp.py < in.txt
200000

real  0m0.059s
user  0m0.056s
sys   0m0.000s

Одна шестнадцатая секунды.