Пока почти вся индустрия по привычке мучает Pandas, команда Polars выкатила фундаментальный релиз 2.0.
Теперь движок по умолчанию умеет сбрасывать данные на диск при нехватке памяти, рвёт DuckDB на SQL-бенчмарках и ломает обратную совместимость ради скорости.
1️⃣ Out-of-core и стриминг из коробки
Раньше классический сценарий выглядел так: у вас 32 ГБ RAM, вы пытаетесь выполнить
LazyFrame.collect() на жирном файле, память забивается под завязку, приходит OOM Killer и убивает процесс.В 2.0 стриминговый движок работает по дефолту. Как только потребление оперативной памяти переваливает за ≈80%, Polars начинает сбрасывать промежуточные результаты на диск (по умолчанию заложен лимит в 64 ГБ). Сортировки, оконные функции и тяжелые вычисления выражений теперь не роняют скрипт.
⚠️ Но стриминговый движок не гарантирует сохранение исходного порядка строк при операциях вроде
join или group_by.2️⃣ SQL первого класса: DuckDB, у вас проблемы
Polars теперь официально позиционирует SQL как равноправный интерфейс. Под капотом переписали оптимизатор: добавили bloom-фильтры, динамические предикаты, умную перестановку join-ов и устранение общих подпланов.
Команда прогнала стандартные бенчмарки TPC-H и TPC-DS против свежих версий DuckDB и DataFusion. Результат: Polars быстрее почти во всех тестах как по суммарному времени, так и по геометрическому среднему.
Есть детская болячка: на мелких объемах данных вылезает оверхед синхронизации (DuckDB там пока выигрывает). Разработчики признали проблему и пообещали поправить в минорных апдейтах. Но на средних и тяжелых нагрузках цифры впечатляют.
3️⃣ Нативный тип Map (человеческие словари)
Раньше хранить ключ-значение внутри таблицы приходилось через костыльный
List(Struct({"key": ..., "value": ...})). Читать и обрабатывать это было мучением.Теперь завезли нативную поддержку Arrow MapType:
pl.Map(key_type, value_type). Появились нормальные человеческие методы для работы со словарями прямо внутри выражений: .map.get(), .map.contains_key(), .map.keys(), .map.values().Быстро, типизировано, без костылей с распаковкой структур.
4️⃣ Жесткая типизация и заточка под AI-агентов
Polars окончательно уходит от неявных приведений типов. Идеология простая: скрипт должен падать сразу, а не через 40 минут расчетов из-за внезапного
null или несовпадения схемы.Для этого докрутили
collect_schema(), который проверяет типы и резолвит схему пайплайна вообще без материализации данных. Это киллер-фича для генерации кода через LLM: агент может за миллисекунды проверить сгенерированный запрос на валидность до того, как начнет выполнять операции на терабайтах данных.🔗 Если сидите на первой версии — читайте миграционный гайд