Подтвердить что ты не робот

В Python быстрее читается() или readlines()?

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

for line in fileHandle
4b9b3361

Ответ 1

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

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

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

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

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

Python 2.7 фиксированное перемежение read() и readline().

Ответ 2

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

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

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

Подробнее о http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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