Работали ли вы с генераторами в Python?

«Работали ли вы с генераторами в Python?» — вопрос из категории Python, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно использовал генераторы в Python для обработки потоков данных и работы с большими наборами информации. Они позволяют создавать итераторы без необходимости загружать все данные в память одновременно.

Пример из практики: обработка больших лог-файлов.

def parse_log_file(file_path):
    """Генератор для построчного чтения и парсинга логов."""
    with open(file_path, 'r') as f:
        for line in f:
            # Базовая очистка и парсинг
            cleaned_line = line.strip()
            if cleaned_line and not cleaned_line.startswith('#'):
                yield cleaned_line

# Использование в конвейере обработки
for log_entry in parse_log_file('server.log'):
    if 'ERROR' in log_entry:
        # Отправка в систему мониторинга
        send_to_monitoring(log_entry)

Ключевые преимущества:

  • Экономия памяти: данные генерируются «лениво» (по требованию).
  • Удобство для конвейеров: легко комбинировать с map, filter и другими генераторами.
  • Упрощение кода: замена накопления списков на потоковую обработку.

Важные нюансы:

  • Генератор является одноразовым итератором — после исчерпания его нельзя переиспользовать.
  • Для повторного использования нужно либо создать новый генератор, либо преобразовать результат в список (если объем данных позволяет).

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