Sys.stdin.readline() и input(): какой из них быстрее при чтении строк ввода и почему?

Я пытаюсь решить, какой из них использовать, когда мне нужно получить строки ввода от STDIN, поэтому мне интересно, как мне нужно выбирать их в разных ситуациях.

Я нашел предыдущую запись (https://codereview.stackexchange.com/info/23981/how-to-optimize-this-simple-python-program), в которой говорится:

Как я могу оптимизировать этот код с точки зрения времени и памяти? Обратите внимание, что я использую другую функцию для чтения ввода, так как sys.stdin.readline() является самым быстрым при чтении строк и ввода() при чтении целых чисел.

Является ли это утверждение истинным?

Ответ 1

Встроенные функции input и sys.stdin.readline не выполняют точно то же самое, а какие быстрее могут зависеть от деталей именно того, что вы делаете. Как отметил aruisdante, разница в Python 3 меньше, чем в Python 2, когда была предоставлена ​​цитата, но все же есть некоторые отличия.

Первое отличие состоит в том, что input имеет необязательный параметр запроса, который будет отображаться, если интерпретатор работает в интерактивном режиме. Это приводит к некоторым накладным расходам, даже если приглашение пуст (по умолчанию). С другой стороны, это может быть быстрее, чем выполнение print перед каждым вызовом readline, если вам нужно приглашение.

Следующее отличие состоит в том, что input удаляет любую новую строку с конца ввода. Если вы все равно разделите это, вы можете быстрее input сделать это для вас, а не делать sys.stdin.readline().strip().

Последнее различие заключается в том, как указывается конец ввода. input будет поднимать EOFError, когда вы вызываете его, если больше нет ввода (stdin был закрыт на другом конце). sys.stdin.readline, с другой стороны, вернет пустую строку в EOF, которую вы должны знать для проверки.

Существует также третий вариант, использующий протокол итерации файла на sys.stdin. Скорее всего, это будет похоже на вызов readline, но, возможно, более приятная логика.

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