Источник: Nuances of Programming
Выпуск pandas датируется 2008 годом, и написана она была на Python, Cython и Си . Сегодня мы сравниваем производительность этой всем известной библиотеки с новой DataFrame библиотекой pypolars , написанной на Rust. Сравнение производится при сортировке и конкатенации данных с 25 миллионами записей, а также при объединении двух CSV-файлов.
Загрузка с форума Reddit данных с именами пользователей
Сначала загрузим с платформы Kaggle CSV-файл , содержащий ~26 миллионов имён пользователей reddit.
И сформируем ещё один CSV-файл с помощью любого текстового редактора или через командную строку:
Сортировка
Теперь сравним алгоритм сортировки двух библиотек:
pandas
pypolars
24секунды, т. е. pypolars здесь в 1,4 раза быстрее pandas
Конкатенация
А теперь посмотрим, как ведут себя библиотеки при конкатенации двух табличных структур данных и распределении их в одну табличную структуру:
pandas
У pandas это заняло 18 секунд:
$ python concat_with_pandas.py
Time: 18.12720185799992
pypolars
Здесь pypolars в 1,2 раза быстрее
$ python concat_with_pypolars.py
Time: 15.001723207000055
Объединение
Загрузка данных для отслеживания ситуации с COVID
Загрузка данных из проекта по отслеживанию ситуации с COVID с помощью команды даёт в файле all-states-history.csv последние данные о распространении коронавируса по всей территории США:
$ curl -LO https: //covidtracking.com/data /download/all -states-history.csv
Загрузка данных по штатам
Это CSV-файл, и в нём каждый штат обозначен соответствующей аббревиатурой. Он нужен для объединения с предыдущим CSV-файлом, в котором приведены лишь аббревиатуры (в столбце state ). Данные получим с помощью этой команды:
Будет выведен файл states.csv с названиями штатов и их сокращёнными обозначениями .
pandas
Используем csvcut , чтобы провести фильтрацию полученного файла joined_pd.csv :
Похоже, объединение работает, и это левое объединение. Интересно, почему значения штатов State , обозначаемых аббревиатурами AS и DC, пусты? Потому что этих аббревиатур нет в самом файле states.csv . Если вы посмотрите на аббревиатуры в файле, то не найдете там значений ни AS, ни DC.
Здесь нет аббревиатуры AS:
$ grep AS states.csv
ALASKA,AK
ARKANSAS,AR
KANSAS,KS
MASSACHUSETTS,MA
NEBRASKA,NE
TEXAS,TX
WASHINGTON,WA
и здесь нет значений для DC:
$ grep DC states.csv
P.S. csvcut находится в csvkit (утилите командной строки, в которой содержатся и некоторые другие полезные инструменты командной строки для очистки, обработки и анализа CSV-файлов).
pypolars
А теперь посмотрим, как выглядит объединённая табличная структура:
Похоже, pypolars удалось избежать пустых значений в объединённом столбце. Ведь здесь объединение по умолчанию — это внутреннее объединение. В отличие от объединения по умолчанию в pandas, которое является левым объединением. Чтобы получить тот же результат, как в pandas, нужно изменить строку 8 на:
df_all_states_history.join(df_states, left_on=”state ”, right_on=”Abbreviation”, how=”left”).to_csv(“joined_pl.csv”)
На моём компьютере получилось ~317 миллисекунд, т. е. здесь:
pypolars в 3 раза быстрее в левом объединении
Заключение
В итоге мы выявили, насколько высокопроизводительна pypolars в сравнении с pandas . Конечно, pandas — более зрелая библиотека (разница около 12 лет), и сообщество всё ещё инвестирует в неё. Но если pypolars будут использовать больше, эта новая библиотека наведёт шороху!
Пара полезных ссылок:
Читайте также:
Перевод статьи Ezz El Din Abdullah : A Rising Library Beating Pandas in Performance