В Python, read () или readlines () быстрее? - PullRequest
19 голосов
/ 22 февраля 2011

Я хочу прочитать огромный файл в моем коде. Читается () или readline () быстрее для этого. Как насчет цикла:

for line in fileHandle

Ответы [ 8 ]

22 голосов
/ 22 февраля 2011

Для текстового файла просто итерация по нему с циклом for - это почти всегда путь.Не берите в голову скорость, она самая чистая.

В некоторых версиях python readline() действительно читает только одну строку, в то время как цикл for читает большие порции и разбивает их на строки, так что это может бытьБыстрее.Я думаю, что более поздние версии Python используют буферизацию и для readline(), поэтому разница в производительности будет крошечной (for, вероятно, все еще микроскопически быстрее, поскольку избегает вызова метода).Однако выбор одного из других по соображениям производительности, вероятно, является преждевременной оптимизацией.

Изменить, чтобы добавить: я только что проверил некоторые заметки о выпуске Python.В Python 2.5 сказано:

Теперь нельзя смешивать итерации по файлу со строкой for в файле и вызывать методы объекта read () / readline () / readlines () объекта файла.

Python 2.6 представил TextIOBase, который поддерживает итерации и readline() одновременно.

Python 2.7 с фиксированным чередованием read() и readline().

15 голосов
/ 22 февраля 2011

Если файл огромен, read () - определенно плохая идея, поскольку он загружает (без параметра размера) весь файл в память.

Readline читает только одну строку за раз, поэтому я бы сказал, что это лучший выбор для больших файлов.

И просто перебор файлового объекта должен быть таким же эффективным, как и использование readline.

См. http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects для получения дополнительной информации

7 голосов
/ 22 февраля 2011

Документы для readlines указывают на наличие необязательного указания размера.Поскольку он настолько расплывчатый, его легко не заметить, но я обнаружил, что часто это самый быстрый способ чтения файлов.Используйте readlines (1), которая намекает на одну строку, но на самом деле читает примерно на 4 или 8 тысяч строк IIRC.Это использует преимущества буферизации ОС и несколько уменьшает количество вызовов без чрезмерного объема памяти.

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

1 голос
/ 07 ноября 2016

read () в основном пытается прочитать весь файл и сохранить его в одну строку для последующего использования, в то время как readlines () также пытается прочитать весь файл, но он выполнит разбиение ("\ n") исохранить строки строк в список.Следовательно, эти два метода не являются предпочтительными, если размер файла слишком велик.

readline () и цикл for (то есть для строки в файле :) будут считывать по одной строке за раз и сохранять ее в строку.Я предполагаю, что они будут использовать то же самое время, чтобы закончить работу, если память позволяет.Однако эти два предпочтительнее, если размер файла огромен.

1 голос
/ 21 мая 2011

Если у вас достаточно памяти, используйте readline, если производительность беспокоит. Я видел, что при использовании gzip-файла выполнение: read().split('\n') заняло 5 секунд, а при использовании итератора - 38 секунд. Размер файла GZ был около 45 МБ.

0 голосов
/ 07 мая 2015

Реальная разница между read () и readlines () Функция чтения просто загружает файл как есть в память. Метод readlines считывает файл как список строк без завершения строки. Метод readlines должен использоваться только для текстовых файлов, и ни один из них не должен использоваться для больших файлов. Если копировать информацию из текстового файла, read работает хорошо, потому что она может быть выведена с помощью функции write без необходимости добавлять завершение строки.

0 голосов
/ 22 февраля 2011

Ни.Оба они будут читать содержимое в память.В случае больших файлов, перебор файлового объекта загружает только одну строку вашего файла за раз и, возможно, является хорошим способом справиться с содержимым огромного файла.

0 голосов
/ 22 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...