Самый быстрый код чтения ввода, который мне удалось создать, приведен ниже. Он считывает весь двоичный ввод сразу, а затем объединяет эти наборы байтов для формирования целых чисел. И он предоставляет результат через итератор ввода (с использованием предложения yield). Зная, что цифры 0–9 имеют код ASCII 48–57, а в качестве разделителей целых чисел используются символы ниже этого диапазона, все, что нужно проверить, это проверить, равен ли байт >= 48.
Код: Выделить всё
from os import read
from os import fstat
def createInputIterator():
vs = 0
for v in read(0, fstat(0).st_size):
if v >= 48:
vs *= 10
vs += v - 48
else:
yield vs # another complete integer has been read
vs = 0
iterator = createInputIterator()
# numbers are consumed one by one like this:
# for i in range( ... ):
x = next(iterator)
PS: Коду, который у меня есть, требуется всего лишь 5% повышения производительности, чтобы завершить задачу в течение ожидаемого периода времени в 2 секунды, и я измерил часть чтения ввода как узкое место (она потребляет более 50% времени выполнения).>
Подробнее здесь: https://stackoverflow.com/questions/778 ... rogramming
Мобильная версия