@Microp

Считать с консоли/файла миллион int 'тов c разумными затратами по памяти и скорости Python?

Есть ли способ в пайтоне считать строку и из неё вырывать по одному значению не сохраняя их никуда, так чтобы это выполнялось более менее быстро (< ~1.5 сек) ограничение по памяти
16 Mb (на число желательно меньше 2 байт, для чисел от -100 до 100, разделены пробелами)
Думал использовать array но
a = array.array('b', (list(map(int, input().split()))))

input().split() сразу всю память займет

самостоятельное разбиение слишком долгое
s = input()
for i in range(n - 1):
j = 1
while s[j] != ' ':
j += 1
func(s[:j])
s = s[j + 1:]
  • Вопрос задан
  • 259 просмотров
Решения вопроса 1
longclaps
@longclaps
Как-то так:
from random import choice
import re

def main(s):
    for g in re.finditer(r'-?\d+', s):
        i = int(g.group(0))
        # print(i)


nums = [str(i) for i in range(-100, 101)]
N = 10 ** 6
s = ' '.join(choice(nums) for _ in range(N))

main(s)

На моей машине main(s) отрабатывает за 0.5сек.
Есть вариант чуть быстрее:

def main(s):
    d = {str(i): i for i in range(-100, 101)}
    for g in re.finditer(r'-?\d+', s):
        i = d[g.group(0)]


зы Python 3.5, на 2.7 будет быстрее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rPman
python очень медленный язык (виртуальная машина), со всем что не реализовано в виде готовой нативной библиотеки с обвязкой

если затык в нативном парсере input stream, попробуйте сами читать файл как бинарный поток с помощью BinaryStream.readByte, и парсить числа (радуйтесь что у вас целые), просто вычитая '0' из кода символа и проверяя на пробел и знак '-'... лишнюю проверку на ошибочные данные тоже можно добавить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы