Самый быстрый способ читать stdin в Python?

Здравствуйте.



На вход подаются такие вот данные:

2

3 3

1 2

2 3

1 3

4 2

1 2

3 4



Первая строка — это число тест кейсов. Первая строка каждого кейса содержит два числа через пробел: сколько разных элементов и сколько пар этих элементов сейчас выведется. Потом выводятся пары. Вот на всякий случай ссылка на задачу: www.spoj.pl/problems/BUGLIFE/



Мне нужно превращать каждый тест-кейс в список пар и отправлять в функцию solve. То есть я должен послать в solve по очереди [(1, 2), (2, 3), (1, 3)] и [(1, 2), (3, 4)]





Обычно я это делаю наивно (до этого ввод никогда не был узким местом)



def main(raw_input=raw_input):

  cases = int(raw_input())

  for case in xrange(cases):

    pairs = []

    tmp = raw_input().split()

    for i in range(int(tmp[1])):

      pr = raw_input().split()

      pairs.append((int(pr[0]), int(pr[1])))

    print 'Scenario #%d:' % (case + 1)

    solve(pairs)



* This source code was highlighted with Source Code Highlighter.




Но тут у задачи оказались драконовские требования по времени, запустил профайлер, оказалось, что сама функция solve практически неощутима, а вот процессинг ввода съедает все время. Я знаю, что можно читать эффективнее, но хотелось бы сразу заполнить этот пробел в знаниях самым оптимальным методом. :-) Если вместо списка пар будет генератор — только лучше.



Заранее спасибо.
  • Вопрос задан
  • 11241 просмотр
Решения вопроса 1
@Ghostwriter
raw_input применяется для интерактивного ввода.

Скорее всего вам нужно пользоваться sys.stdin.read(), или sys.stdin.readlines(), или итеративно через генератор (for line in sys.stdin).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sdfsdhgjkbmnmxc
@sdfsdhgjkbmnmxc
Я бы вот так делал:
sys.stdin.next() # skip first line
pairs = [map(int, line.split()[:2]) for line in sys.stdin]
Ответ написан
Комментировать
bobry
@bobry
По идее, использование спискового выражения должно дать небольшой бонус:

def main():
  for case in xrange(int(raw_input())):
    pairs = [map(int, raw_input().split()) for _ in raw_input().split()]
    print 'Scenario #%d:' % (case + 1)
    solve(pairs)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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