Движок под вашим кодом был заменен
Polars 2.0 реализует фундаментальный, зачастую незаметный сдвиг: стандартный движок запросов был заменен. Без каких-либо изменений в коде существующие запросы теперь выполняются на новом streaming engine, отходя от прежней системы in-memory. Это архитектурное изменение затрагивает каждого пользователя Polars сразу после обновления.
Ранее движок in-memory работал как склад, требуя загрузки всего набора данных в RAM перед началом обработки. Шаги запроса затем выполнялись по этим полностью загруженным данным. Этот метод был быстрым только тогда, когда весь набор данных помещался в доступную память, что ограничивало масштабируемость для более крупных операций.
Новый streaming engine использует другую парадигму, похожую на конвейер. Он разбивает данные на небольшие, оптимизированные morsels, размер которых специально подобран так, чтобы они помещались в кэш процессора. Эти morsels затем последовательно проходят через план запроса, но с критическим отличием.
Этот конвейерный, поблочный подход является прямым источником значительного прироста скорости. Различные части запроса теперь могут выполняться параллельно над отдельными morsels, устраняя предыдущие узкие места, где один шаг должен был ждать обработки всего набора данных. Эта concurrency оптимизирует поток данных, делая сложные операции значительно быстрее за счет эффективной непрерывной обработки. Переход на новый движок направлен на максимальное использование CPU за счет локализации данных и их постоянного движения.
Цена скорости: ваши данные не упорядочены
Параллелизм в новом streaming engine имеет существенную цену: row order больше не гарантируется. Операции, включая joins, group-bys и unpivots, могут возвращать строки в последовательности, отличной от входной. Такое поведение отражает параллельную обработку данных "morsels" движком, где несколько задач завершаются независимо, подобно рабочим на конвейере.
Это изменение представляет собой самое опасное нововведение Polars 2.0 из-за возможности silent failures. Ваш код не упадет, а вычисленные числа могут оставаться арифметически верными. Однако, если последующие процессы неявно полагаются на порядок входных строк, данные могут привязаться к неверным сущностям, что приведет к искажению анализа без генерации ошибки. Такие проблемы гораздо сложнее обнаружить, чем явные исключения.
Теперь явное указание намерений становится обязательным для сортировки. Если операция требует определенной последовательности строк, вы должны сообщить об этом Polars напрямую. Например, операция join теперь принимает maintain_order='left' для сохранения порядка левой стороны. Этот дизайн меняет неявное удобство на explicit correctness, заставляя разработчиков декларировать требования к порядку.
Polars 2.0 навязывает декларативный подход к порядку данных, предотвращая предположения, которые могут привести к необнаруженному искажению данных. Хотя функция explain() может раскрыть базовое поведение запроса, разработчики должны проактивно проверять последствия для порядка. Этот сдвиг подчеркивает приверженность производительности и надежной целостности данных в противовес историческим неявным гарантиям, способствуя большей ясности в конвейерах обработки данных.
«Скучный» релиз, который намеренно ломает вещи
Polars 2.0 не содержит крупных новых функций. Вместо этого он служит cleanup release, укрепляющим внутренний фундамент библиотеки. Эта версия намеренно вводит критические изменения, отдавая приоритет долгосрочной согласованности и архитектурной надежности, а не обратной совместимости для минорных обновлений.
Десятки методов были переименованы или удалены. К ним относятся:
meltтеперь называетсяunpivotread_csvзаменен наscan_csv().collect()LazyFrame.profile()был удаленjoin_nullsтеперь называетсяnulls_equal- Для приведения целого числа напрямую к типу categorical требуется
cat.to() concatтеперь отклоняет несоответствующие по высоте данные, вместо попытки угадать намерение пользователя
Polars выдает полезную ошибку AttributeRemovedError при таких изменениях. Эта ошибка четко указывает, какую новую функцию или метод следует использовать, помогая пользователям в процессе миграции.
Эта философия резко контрастирует с подходом Pandas, который часто переносит неоднозначность и потенциальные проблемы на этап выполнения. Polars стремится обнаруживать ошибки на ранней стадии, делая код более предсказуемым и надежным до его запуска. Эти критические изменения в сочетании с очень подробными сообщениями об ошибках являются основной частью стратегии превентивного проектирования Polars.
Нравится статья? Получайте такие каждое утро на почту.
одно письмо в день · отписка в два клика · без сторонних трекеров
Вердикт: обновляться сейчас, подождать или провести аудит?
Заявление Polars о 5-кратном увеличении производительности с новым streaming engine — это ожидание, а не универсальный бенчмарк. Этот движок, хотя и является фундаментальным, пока не предлагает полноценную обработку данных вне оперативной памяти (out-of-core); данные по-прежнему должны помещаться в RAM. Релиз 2.0 подготавливает библиотеку к будущим возможностям, которые позволят работать с наборами данных, превышающими объем памяти.
В настоящее время Polars 2.0 является release candidate, требующим установки с флагом --pre. Эта версия еще не стабильна и содержит ошибки, такие как критическая проблема, при которой group_by_dynamic вызывает ошибки выхода за пределы диапазона даты и времени (datetime out-of-range) в streaming engine. Кроме того, str.to_datetime теперь может возвращать null вместо генерации исключений, а метод limit не завершается досрочно после join.
Новым проектам стоит рассмотреть возможность начала работы с Polars 2.0, чтобы использовать обновленный API с самого начала. Для существующих кодовых баз слепое обновление не рекомендуется. Разработчикам необходимо провести аудит своего кода на наличие операций, таких как joins или group-bys, которые неявно зависят от порядка строк. Явно добавьте сортировку или используйте флаги maintain_order, чтобы обеспечить согласованность данных и предотвратить скрытые проблемы с целостностью данных.
Часто задаваемые вопросы
Какое самое большое изменение в Polars 2.0?
Движок запросов по умолчанию был заменен на новый 'streaming' engine. Этот движок обрабатывает данные небольшими параллельными блоками для значительного прироста производительности, но в качестве компромисса больше не гарантирует исходный порядок строк по умолчанию.
Почему Polars 2.0 меняет порядок моих строк?
Новый streaming engine распараллеливает операции над блоками данных ('morsels'). Чтобы максимизировать скорость, он не ждет сборки этих блоков в их исходном порядке. Теперь вы должны явно запрашивать сохранение порядка, используя параметры, такие как maintain_order=True.
Действительно ли Polars 2.0 быстрее в 5 раз?
Цифра 'в 5 раз быстрее' — это ожидание команды Polars, а не гарантированный бенчмарк. Хотя новый движок заметно быстрее, фактический прирост производительности зависит от вашего оборудования, набора данных и конкретных операций, которые вы выполняете.
Что означает 'streaming' в Polars 2.0?
В настоящее время 'streaming' относится к модели выполнения с использованием блоков и конвейеров, которая обрабатывает данные частями, размер которых соответствует кэшу вашего процессора. Это еще не означает полноценную обработку вне оперативной памяти (out-of-core), при которой наборы данных могут быть больше, чем RAM вашего компьютера.
Безопасно ли использовать Polars 2.0 в продакшене?
Первоначальная версия 2.0 является release candidate. Учитывая значительные изменения в поведении (например, порядок строк) и некоторые известные ошибки, разумно тщательно проверить существующие кодовые базы и дождаться стабильного релиза перед развертыванием в критически важных производственных средах.

