Почему слияния панд в python быстрее, чем слияния data.table в R в 2012 году? - PullRequest
154 голосов
/ 24 января 2012

Я недавно натолкнулся на библиотеку pandas для python, которая согласно этому тесту выполняет очень быстрое слияние в памяти.Это даже быстрее, чем пакет data.table в R (мой язык выбора для анализа).

Почему pandas намного быстрее, чем data.table?Это из-за присущего скорости питона преимущество над R, или есть какой-то компромисс, о котором я не знаю?Есть ли способ выполнения внутренних и внешних объединений в data.table без обращения к merge(X, Y, all=FALSE) и merge(X, Y, all=TRUE)?

Comparison

Вот код R и код Python , используемый для тестирования различных пакетов.

Ответы [ 3 ]

189 голосов
/ 24 января 2012

Причина, по которой pandas быстрее, заключается в том, что я придумал лучший алгоритм, который очень тщательно реализован с использованием быстрой реализации хеш-таблицы - klib и в C / Cython , чтобы избежатьнакладные расходы интерпретатора Python для не векторизованных частей.Алгоритм описан более подробно в моей презентации: Взгляд на дизайн и разработку панд .

Сравнение с data.table на самом деле немного интересно, потому чтоВесь смысл R data.table состоит в том, что он содержит предварительно вычисленные индексы для различных столбцов для ускорения таких операций, как выбор данных и слияния.В этом случае (объединение базы данных) DataFrame pandas не содержит никакой предварительно вычисленной информации , которая используется для слияния, так сказать, это «холодное» слияние.Если бы я сохранил факторизованные версии ключей соединения, соединение было бы значительно быстрее - поскольку факторизация является самым узким местом для этого алгоритма.

Я должен также добавить, что внутренний дизайн DataFrame панд гораздо болееПодходит для таких операций, чем data.frame R (который является просто внутренним списком массивов).

116 голосов
/ 25 января 2012

Похоже, что Уэс, возможно, обнаружил известную проблему в data.table, когда число уникальных строк ( уровней ) велико: 10000.

Показывает ли Rprof() большую частьвремя, проведенное в звонке sortedmatch(levels(i[[lc]]), levels(x[[rc]])?Это на самом деле не само объединение (алгоритм), а предварительный шаг.

Недавние усилия были направлены на то, чтобы разрешить символьные столбцы в ключах, что должно решить эту проблему путем более тесной интеграции с собственным глобальным строковым хешем RТаблица.Некоторые результаты тестов уже сообщаются test.data.table(), но этот код еще не подключен для замены уровней на совпадение уровней.

Панды сливаются быстрее, чем data.table для обычных целочисленных столбцов?Это должен быть способ изолировать сам алгоритм от проблем фактора.

Кроме того, data.table имеет в виду слияние временных рядов .Два аспекта этого: i) многостолбцовые упорядоченные ключи, такие как (id, datetime) ii) быстрое преобладающее соединение (roll=TRUE), то есть последнее перенесенное наблюдение.

Мне понадобитсянемного времени для подтверждения, так как это первое, что я видел в сравнении с data.table в представленном виде.


ОБНОВЛЕНИЕ из data.table v1.8.0, выпущенного в июле 2012 года

  • Внутренняя функция sortedmatch () удалена и заменена на chmatch () при сопоставлении уровней i с уровнями x для столбцов типа 'factor'.Этот предварительный шаг вызывал (известное) значительное замедление, когда число уровней столбца факторов было большим (например,> 10000).Усиление в тестах объединения четырех таких столбцов, как продемонстрировал Уэс МакКинни (автор пакета Python Pandas).Например, соответствие миллиону строк, из которых 600 000 уникальны, теперь уменьшено с 16 до 0,5.

также в этом выпуске было:

  • столбцы символов теперь разрешены в ключах и предпочтительнее фактораdata.table () и setkey () больше не приводят символ к фактору.Факторы все еще поддерживаются.Реализует FR # 1493, FR # 1224 и (частично) FR # 951.

  • Новые функции chmatch () и% chin%, более быстрые версии match () и% в% для символавекторы.Используется внутренний строковый кеш R (хеш-таблица не создается).Они примерно в 4 раза быстрее, чем match () в примере в? Chmatch.

По состоянию на сентябрь 2013 года data.table на CRAN v1.8.10, а мы работаем на v1.9,0. NEWS обновляется в режиме реального времени.


Но, как я писал ранее, выше:

data.table имеет временные ряды объединяются в виду.Два аспекта: i) многостолбцовые упорядоченные ключи, такие как (id, datetime) ii) быстрое преобладающее соединение (roll=TRUE), то есть последнее перенесенное наблюдение.

ИтакPandas equi соединение двух столбцов символов, вероятно, все еще быстрее, чем data.table.Так как он звучит так, как будто он объединяет две колонки.data.table не хэширует ключ, потому что имеет в виду преобладающие упорядоченные объединения.«Ключ» в data.table - это буквально просто порядок сортировки (аналогично кластерному индексу в SQL; т. Е. Так упорядочиваются данные в оперативной памяти).В список следует добавить дополнительные ключи, например.

В итоге, явная разница в скорости, выделенная этим конкретным двухсимвольным тестом с более чем 10000 уникальными строками, не должна быть такой плохой, посколькуизвестная проблема была исправлена.

37 голосов
/ 10 сентября 2015

Этой теме два года, но кажется, что люди могут приземлиться, когда они ищут сравнения панд и data.table

Поскольку оба они развивались с течением времени, я хочу опубликоватьСравнительно новое сравнение (с 2014 года) здесь для заинтересованных пользователей: https://github.com/Rdatatable/data.table/wiki/Benchmarks-:-Grouping

Было бы интересно узнать, если Уэс и / или Мэтт (кстати, являются создателями Pandas и data.table соответственно)и оба прокомментировали выше) есть какие-либо новости, чтобы добавить сюда также.

- ОБНОВЛЕНИЕ -

Комментарий, размещенный ниже jangorecki, содержит ссылку, которая, на мой взгляд, очень полезна: https://github.com/szilard/benchm-databases

https://github.com/szilard/benchm-databases/blob/master/plot.png

Этот график показывает среднее время операций агрегации и объединения для различных технологий ( ниже = быстрее ; последнее обновление сравненияв сентябре 2016 г.)Для меня это было действительно познавательно.

Возвращаясь к вопросу, R DT key и R DT ссылаются на ключевые / неключевые разновидности data.table R и оказываются быстрее в этом тесте, чем Панды Python (Py pandas).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...