Новая библиотека превосходит Pandas по производительности |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2021-01-26 19:00 Выпуск pandas датируется 2008 годом, и написана она была на Python, Cython и Си. Сегодня мы сравниваем производительность этой всем известной библиотеки с новой DataFrame библиотекой pypolars, написанной на Rust. Сравнение производится при сортировке и конкатенации данных с 25 миллионами записей, а также при объединении двух CSV-файлов. Загрузка с форума Reddit данных с именами пользователей Сначала загрузим с платформы Kaggle CSV-файл, содержащий ~26 миллионов имён пользователей reddit. И сформируем ещё один CSV-файл с помощью любого текстового редактора или через командную строку: $ cat >> fake_users.csv Сортировка Теперь сравним алгоритм сортировки двух библиотек: pandas import timeit start = timeit.default_timer() df = pd.read_csv('users.csv') $ python sort_with_pandas.py pypolars import timeit start = timeit.default_timer() df = pl.read_csv('users.csv') $ python sort_with_pypolars.py ~24 секунды, т. е. pypolars здесь в 1,4 раза быстрее pandas Конкатенация А теперь посмотрим, как ведут себя библиотеки при конкатенации двух табличных структур данных и распределении их в одну табличную структуру: pandas import timeit start = timeit.default_timer() df_users = pd.read_csv('users.csv') У pandas это заняло 18 секунд: $ python concat_with_pandas.py pypolars import timeit start = timeit.default_timer() df_users = pl.read_csv('users.csv') Здесь pypolars в 1,2 раза быстрее $ python concat_with_pypolars.py Объединение Загрузка данных для отслеживания ситуации с COVID Загрузка данных из проекта по отслеживанию ситуации с COVID с помощью команды даёт в файле all-states-history.csv последние данные о распространении коронавируса по всей территории США: $ curl -LO https://covidtracking.com/data/download/all-states-history.csv Загрузка данных по штатам Это CSV-файл, и в нём каждый штат обозначен соответствующей аббревиатурой. Он нужен для объединения с предыдущим CSV-файлом, в котором приведены лишь аббревиатуры (в столбце $ curl -LO https://gist.githubusercontent.com/afomi/8824ddb02a68cf15151a804d4d0dc3b7/raw/5f1cfabf2e65c5661a9ed12af27953ae4032b136/states.csv Будет выведен файл states.csv с названиями штатов и их сокращёнными обозначениями. pandas import timeit start = timeit.default_timer() df_all_states_history = pd.read_csv('all-states-history.csv') $ python join_with_pandas.py Используем csvcut, чтобы провести фильтрацию полученного файла joined_pd.csv: $ csvcut -c date,state,State joined_pd.csv | head | csvlook Похоже, объединение работает, и это левое объединение. Интересно, почему значения штатов State, обозначаемых аббревиатурами AS и DC, пусты? Потому что этих аббревиатур нет в самом файле states.csv. Если вы посмотрите на аббревиатуры в файле, то не найдете там значений ни AS, ни DC. Здесь нет аббревиатуры AS: $ grep AS states.csv и здесь нет значений для DC: $ grep DC states.csv P.S. csvcut находится в csvkit (утилите командной строки, в которой содержатся и некоторые другие полезные инструменты командной строки для очистки, обработки и анализа CSV-файлов). pypolars import timeit start = timeit.default_timer() df_all_states_history = pl.read_csv('all-states-history.csv') $ python join_with_pypolars.py А теперь посмотрим, как выглядит объединённая табличная структура: $ csvcut -c date,state,State joined_pl.csv | head | csvlook Похоже, 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 будут использовать больше, эта новая библиотека наведёт шороху! Пара полезных ссылок:
Источник: m.vk.com Комментарии: |
|