Хабр, привет! Это Леша Жиряков, техлид backend-команды витрины онлайн-кинотеатра KION. В мире дата-аналитики Pandas остается одной из самых популярных библиотек. Но это вовсе не значит, что нет других быстрых, удобных и производительных инструментов. Мой пост покажет альтернативы: от колоночной DuckDB и сверхскоростной Polars до мощного Modin и гибкого Vaex. В подборке я постарался передать главную суть — назначение и преимущества инструмента и его характеристики с GitHub.
Polars
Polars — высокопроизводительная открытая библиотека для работы с данными, полностью написанная на языке Rust. Ее разработка началась в 2020 году. Цель — предоставить Python-программистам эффективный инструмент для работы с данными, который станет альтернативой популярной библиотеке Pandas.
И такой инструмент появился. Polars обеспечивает высокую скорость обработки больших наборов данных благодаря использованию параллельных вычислений и оптимизированного управления памятью. Тут интуитивно понятный API для выполнения операций фильтрации, сортировки, группировки и агрегации данных, так что это мощный инструмент для анализа и обработки информации.
особенности: использует колоночный формат Apache Arrow для хранения данных;
количество звезд на GitHub: 31 тыс.;
открытых Issues: 2,1 тыс.;
версия: 1.17.1;
Merge Requests (MRs): комьюнити.
Недавние тесты производительности показывают, что библиотека Polars превосходит Pandas в скорости выполнения различных операций с данными. Автор исследования выполнил операции фильтрации, агрегации, группировки и сортировки на наборе данных Covertype, содержащем 581 012 строк и 54 столбца.
Результаты тестов:
Фильтрация данных: Polars выполнил операцию за 0,0183 секунды, тогда как Pandas потребовалось 0,0741 секунды. Это делает Polars примерно в четыре раза быстрее.
Агрегация: Polars справился за 0,0083 секунды, в то время как Pandas занял 0,1863 секунды, показывая преимущество Polars более чем в 22 раза.
Группировка (GroupBy): Polars завершил задачу за 0,0106 секунды, а Pandas — за 0,0873 секунды, что делает Polars примерно в восемь раз быстрее.
Сортировка: Polars потребовалось 0,0656 секунды, тогда как Pandas — 0,2027 секунды. Polars быстрее примерно в три раза.
Эти результаты подтверждают, что Polars благодаря своей архитектуре на языке Rust, параллельной обработке и оптимизации запросов повышает производительность по сравнению с Pandas, особенно при работе с большими наборами данных.
А вот еще тест. В этой статье автор провел сравнение DuckDB и Polars. Для тестирования использовался набор данных 2021 Yellow Taxi Trip объемом около 3 Гб, содержащий 30 миллионов строк и 18 столбцов. Тесты выполнялись на ноутбуке Apple M1 MAX MacBook Pro 2021 с 64 Гб ОЗУ и 10-ядерным CPU.
Провели такие тесты:
чтение CSV-файла: измерение времени, необходимого для загрузки данных из CSV;
простые агрегации: вычисление суммы, среднего, минимума и максимума для определенных столбцов;
групповые агрегации: выполнение с использованием операций группировки;
оконные функции: применение оконных функций к данным;
соединения (Joins): выполнение операций объединения данных из разных источников.
Оказалось, что Polars превосходит DuckDB во всех тестах, включая операции объединения.
Больше информации и новостей о проекте — на официальном сайте Polars.
DuckDB
Аналитическая in-process SQL СУБД, оптимизирована для выполнения аналитических запросов. Создана Марком Раасвельдтом и Ханнесом Мюлейзеном в Центре математики и информатики (Centrum Wiskunde & Informatica, CWI) в Нидерландах. Первая версия выпущена в 2019 году. Цель разработки DuckDB — создание встроенной аналитической БД, способной эффективно выполнять сложные запросы к большим наборам данных, особенно для задач онлайн-аналитической обработки (OLAP).
В отличие от других встроенных баз данных, таких как SQLite, DuckDB ориентирована не на транзакционные приложения (OLTP), а именно на аналитические нагрузки.
особенности: архитектура с колоночным хранением данных и векторизированной обработкой запросов обеспечивает высокую производительность при анализе;
количество звезд на GitHub: 25,1 тыс.;
количество открытых Issues: 297;
последняя версия: 1.1.3;
Merge Requests (MRs): комьюнити.
Недавние тесты производительности показывают, что DuckDB значительно превосходит Pandas в скорости выполнения различных операций с данными. В одном из сравнений, проведенном в ноябре 2024 года, были протестированы операции фильтрации, агрегации, группировки и сортировки на наборе данных Covertype, содержащем 581 012 строк и 54 столбца.
Результаты тестов:
Вычисление скользящих средних: DuckDB продемонстрировал высокую производительность при вычислении скользящих средних на наборе данных с более чем 100 миллионами строк, завершив операцию примерно за 55 секунд. В то время как в случае с Pandas автор работы столкнулся с проблемами загрузки такого объема данных в память.
DuckDB показал неплохую эффективность при генерации искусственного набора данных, но точные временные показатели не были указаны.
Получается, DuckDB демонстрирует высокую производительность и эффективность при обработке больших наборов данных. Особенно в случаях, когда Pandas сталкивается с ограничениями памяти.
DuckDB выделяется универсальностью, SQL-поддержкой и простотой интеграции с различными системами. Выбор между Polars и DuckDB зависит от типа задач: для быстрой обработки данных в памяти лучше подходит Polars, а для SQL-анализа и комплексных запросов — DuckDB.
Больше информации — на официальном сайте DuckDB.
Vaex
Высокопроизводительная библиотека для Python, предназначенная для обработки и визуализации больших наборов данных. Разработана в 2014 году Маартеном Брейманом (Maarten Breddels). Цель — предоставить инструмент, который сможет эффективно работать с данными, превышающими объем ОЗУ, без необходимости загружать их полностью.
особенности: Vaex — библиотека для обработки больших объемов данных вне оперативной памяти (out-of-core), позволяющая выполнять операции, не загружая все полностью в память. Использует гибридный формат Apache Arrow/NumPy;
количество звезд на GitHub: 8,3 тыс.;
количество открытых Issues: 437;
последняя версия: 4.18.1;
Merge Requests (MRs): комьюнити.
Что касается бенчмарков, то Vaex показывает высокую производительность в задачах сортировки и группировки данных. В рамках исследования были проведены тесты, оценивающие скорость выполнения следующих операций:
Чтение данных из CSV-файла: Vaex загрузил файл объемом около 200 Мб за 15,8 миллисекунды, тогда как Pandas потребовалось 2,19 секунды, что делает Vaex примерно в 138 раз быстрее.
Чтение данных с использованием chunk_size: Vaex обработал данные за 28,6 микросекунды (0,0286 миллисекунды), тогда как Pandas выполнил ту же операцию за 4,41 миллисекунды. Получается, Vaex примерно в 154 раза быстрее.
Vaex показывает себя особенно эффективно при выполнении операций группировки и агрегации. Особенно с данными, превышающими объем оперативной памяти.
Modin
Библиотека для Python. Цель — предоставить пользователям возможность масштабировать свои рабочие процессы, основанные на Pandas, без необходимости вносить значительные изменения в код. Основная идея Modin заключается в том, чтобы быть drop-in-заменой для Pandas, позволяя использовать все доступные ядра процессора для ускорения вычислений. Это особенно полезно при работе с большими наборами данных, где стандартный Pandas может быть медленным или потреблять слишком много памяти.
особенности: Modin поддерживает различные движки для распределенных вычислений, такие как Ray и Dask, что позволяет эффективно распределять нагрузку и ускорять обработку данных;
количество звезд на GitHub: 9,9 тыс.;
количество открытых Issues: 638;
последняя версия: 0.32.0;
Merge Requests (MRs): комьюнити.
Modin показывает улучшенную производительность по сравнению с Pandas при обработке больших данных:
Чтение данных из CSV-файла: для небольших файлов (около 1,69 Мб) Pandas выполняет чтение быстрее, чем Modin, из-за накладных расходов на параллелизацию. Но для более крупных файлов (около 169 Мб) Modin превосходит Pandas, демонстрируя ускорение примерно в 1,71 раза.
Эффективность Modin по сравнению с Pandas зависит от размера обрабатываемых данных. Для небольших наборов данных Pandas может быть более производительным, тогда как для больших объемов данных Modin обеспечивает значительное ускорение за счет параллельной обработки.
Тут Ченг Жи Чжао рассмотрел четыре высокопроизводительные библиотеки для анализа данных в Python: Polars, DuckDB, Vaex и Modin. Автор провел сравнительный анализ этих инструментов, используя набор данных NYC Parking Tickets с 10,8 миллионами строк и 51 столбцом. Тесты включали операции фильтрации, агрегации, объединения и оконных функций. Оказалось, что Modin превосходит Pandas по скорости выполнения задач, но в некоторых случаях уступает Polars и DuckDB.
Больше информации — на официальном сайте Modin.
Dask
Библиотека с открытым исходным кодом для параллельных и распределенных вычислений в Python. Она создана Мэтью Роклином (Matthew Rocklin) в декабре 2014 года в компании Continuum Analytics (позднее ставшей Anaconda, Inc.) в рамках проекта Blaze, финансируемого DARPA.
особенности: Dask — это библиотека, позволяющая распределять задачи на кластере. Обеспечивает масштабируемость и может работать с массивами данных, превышающими объем оперативной памяти;
количество звезд на GitHub: 12,7 тыс.;
количество открытых Issues: 917;
последняя версия: 2024.12.1;
Merge Requests (MRs): комьюнити.
Что касается производительности, то наилучшие результаты библиотека показывает в следующих случаях:
Чтение данных из CSV-файла: Pandas — при попытке загрузить файл размером 3,6 Гб возникает ошибка памяти, что делает невозможным обработку такого объема данных. Dask успешно загружает и обрабатывает файл размером 3,6 Гб, демонстрируя способность работать с большими наборами данных, превышающими объем оперативной памяти.
Группировка и агрегация данных: Pandas при работе с файлом размером 3,6 Гб не может выполнить операцию из-за ограничений памяти. Dask успешно выполняет операцию группировки и агрегации на том же файле, показывая эффективность при обработке больших данных.
Чтобы получить больше информации, смотрите официальный сайт Dask.
(py)Datatable
Высокопроизводительная многопоточная библиотека для обработки двумерных табличных данных в Python. Ориентирована на поддержку BigData и обеспечивает эффективную работу как с информацией в памяти, так и с данными, хранящимися на диске. Библиотека вдохновлена R's data.table и стремится воспроизвести ее основные алгоритмы и API.
количество звезд на GitHub: 1,8 тыс.;
количество открытых Issues: 170;
последняя версия: 1.1.0;
Merge Requests (MRs): комьюнити.
На этом все. А что больше нравится вам? Поделитесь опытом, где встречали проблемы.
dolfinus
Очень странная статья.
Сравнение производительности на запросах длительностью в несколько микросекунд, хотя на таких масштабах IO latency может нивелировать всю разницу промзводительности. На вряд ли кто-то из аналитиков и DS будет менять свой стек ради ускорения настолько коротких запросов. Тут нужно либо сравнивать больше данных, либо делать более сложные запросы, например join.
Не везде указано отличие в способе работы с данными. Pandas всегда работает с данными в памяти. Polars умеет и помещать данные в память, и работать в out-of-core режиме, обращаясь к файлам на диске и обрабатывая их небольшими чанками. DuckDB/Dask всегда используют out-of-core. Плюс многие либы сейчас используют под капотом Apache Arrow (в том числе Pandas 2.x), так что способ представления данных в памяти у них одинаковый, что позволяет легко передавать данные между ними без дополнительной конвертации.
Не указано различие в API - какие-то либы предлагают совместимый с pandas DataFrame API, у polars свой собственный DataFrame API (иммутабельный, в отличие от pandas) + есть поддержка SQL, у DuckDB только SQL.
Dask умеет в распределённый режим работы, когда воркеры могут запускаться на разных машинах, и обрабатывать отдельные кусочки данных, что даёт горизонтальное масштабирование. Pandas/Polars/DuckDB так не умеют, и их производительность ограничена ресурсами одного хоста. Dask имеет смысл сравнивать с Apache Spark, а не с ними.
Указаны последние версии либ, но не когда они были опубликованы. У Pydatatable последний коммит был год назад, выглядит не особо живым. Vaex как будто тоже остановился в развитии, релизов за последний год не было.