Короткий ответ
readlines() загружает все строки файла в память одним списком, тогда как итерация по файловому объекту читает и обрабатывает по одной строке за раз, потребляя почти постоянный объём памяти независимо от размера файла.
Как это работает подробнее
Файловый объект в Python сам является итератором строк — for line in f читает данные из буфера построчно по запросу. readlines() явно материализует весь файл в виде списка строк в памяти перед тем, как вы получите к нему доступ.
Пример кода
example-249.py
def count_errors(path):
count = 0
with open(path) as f: # построчная итерация, не readlines()
for line in f:
if "ERROR" in line:
count += 1
return count
# Проверка: на файле в несколько ГБ функция работает с минимальным ростом RSS процесса,
# в отличие от варианта с f.readlines(), где память растёт пропорционально размеру файлаЧто использовать на практике
- Практика. Для файлов, которые могут быть гигабайтными (логи, дампы, CSV), построчная итерация или собственный генератор позволяют обрабатывать данные с ограниченным потреблением памяти, что важно в контейнерах с лимитом по памяти.
Подводные камни
- Риски. Используют
readlines()по привычке там, где нужна лишь последовательная обработка, не рассчитывая реальный размер файлов в production; пытаются индексировать построчный итератор как список без предварительногоlist().