Оптимизация ввода-вывода для Python

Я пишу программу, которая принимает несколько строк кода. На данный момент я обрабатываю каждую строку отдельно -> по мере поступления каждой строки я удаляю ее, сохраняю и т. д., прежде чем запрашивать следующую строку с помощью метода sys.stdin.readline(). Мне было интересно, есть ли способ повысить мою эффективность, поскольку моя программа в настоящее время слишком медленная. Быстрее ли просто взять все строки сразу (я знаю, сколько строк я ожидаю), сохранить их в списке, а затем обработать? Если да, то есть ли какая-либо встроенная функция, рассчитанная на скорость и способная делать это эффективно?

Спасибо


person user1998665    schedule 23.01.2013    source источник
comment
Как вы пришли к выводу, что ваша программа работает медленно?   -  person Yuval Adam    schedule 24.01.2013
comment
Это для соревнования по программированию, и я получил сообщение об ошибке при отправке.   -  person user1998665    schedule 24.01.2013
comment
Функция, созданная для скорости, которая может сделать это эффективно, называется readline (или, если вы хотите быть более идиоматичным, next). Чтение файла использует буфер и выполняет ввод-вывод только тогда, когда он доходит до конца буфера. Маловероятно, что readline является вашей реальной проблемой. Но, ничего не зная о вашей программе, трудно сказать что-то еще.   -  person abarnert    schedule 24.01.2013
comment
Кроме того, вместо того, чтобы гадать или просить других угадать, почему бы не попробовать протестировать? Просто напишите это двумя способами — по одной строке за раз и все сразу — и используйте timeit для сравнения двух. Тогда вы будете точно знать, что быстрее, что намного полезнее, чем знать, что какой-то парень в Интернете подозревает, что один может быть быстрее другого.   -  person abarnert    schedule 24.01.2013
comment
abarnert, я не знаю, как будет называться файл. Правила определяют только то, что это будет стандартная процедура stdin.   -  person user1998665    schedule 24.01.2013
comment
Кроме того, время было не очень эффективным для моих целей. Знаете ли вы какой-либо другой метод таймера Python?   -  person user1998665    schedule 24.01.2013
comment
Вы можете попробовать опубликовать свой код, чтобы мы могли взглянуть на него...   -  person Talvalin    schedule 24.01.2013


Ответы (2)


Вы можете немного ускорить работу, прочитав все строки сразу, а затем разделив их и поместив в список, подобный этому:

import sys
lines = sys.stdin.read().splitlines(False)
if lines:
    # process lines list....
person martineau    schedule 24.01.2013

Метод readlines() прочитает файл и автоматически разделит его на список, разбитый символами новой строки. Затем вы можете многократно применять метод rstrip('\r\n') к списку. В качестве альтернативы, если вы знаете символ новой строки (обычно '\n' для *nix), вы можете связать методы чтения и разделения следующим образом: .read().split('\n').

Образец кода:

file_ob = open(path/to/file,'r')
# Method 1
file_list = file_obj.readlines()
for f in file_list
    clean = f.rstrip('\r\n')
    #do something with clean
# Method 2
clean_list = file_obj.read().split('\r')
# do something with clean_list
person Tauchiss    schedule 23.01.2013
comment
Спасибо. Единственная проблема заключается в том, что ожидается, что у него будут стандартные процедуры stdin, и я не знаю, совместим ли open(path/to/file,'r') с тем, как они хотят вводить информацию. Опять же, я могу ошибаться, я точно не знаю, что влечет за собой стандартная процедура stdin - person user1998665; 24.01.2013
comment
@user1998665 user1998665: стандартная процедура стандартного ввода влечет за собой чтение входных данных из sys.stdin. - person martineau; 24.01.2013
comment
правильно, так что не будет ли это отличаться от метода ввода файла, подобного тому, который предложил Таучисс - person user1998665; 24.01.2013
comment
@ user1998665: Нет, если было перенаправление входного файла, как в python myscript.py <input_file.txt. Кроме того, sys.stdin уже открыт при запуске скрипта, поэтому для его использования также не требуется open(<filename>). - person martineau; 24.01.2013