Недавно я наткнулся на библиотеку pandas для python, которая, согласно этому бенчмарку, очень быстро объединяет данные в памяти. Она даже быстрее, чем data.table пакет в R (мой любимый язык для анализа).
Почему pandas
намного быстрее, чем data.table
? Это связано с присущим python преимуществом в скорости по сравнению с R, или есть какой-то компромисс, о котором я не знаю? Есть ли способ выполнять внутренние и внешние соединения в data.table
, не прибегая к merge(X, Y, all=FALSE)
и merge(X, Y, all=TRUE)
?
Вот код R и код Python, использованные для сравнения различных пакетов.
Существуют большие ответы, особенно сделанные авторами обоих инструментов, о которых спрашивает вопрос. Ответ Matt объясняет случай, о котором сообщают в вопросе, что он был вызван ошибкой и не алгоритмом слияния. Ошибка назад уже была закреплена в следующий день, больше, чем 7 несколько лет.
В моем ответе я обеспечу некоторые актуальные синхронизации объединяющейся операции для data.table и панд. Обратите внимание, что plyr и базируются, слияние R не включены.
Синхронизации, которые я представляю, происходят от сравнительный тест дб проект, непрерывно выполняемый восстанавливаемый сравнительный тест. Это обновляет инструменты до последних версий и повторно выполненных сценариев сравнительного теста. Это выполняет много других программных продуктов. Если Вы интересуетесь Spark, Dask, и немногие другие, несомненно, проверят ссылку.
<час>На данный момент... (все еще, чтобы быть реализованным: еще один размер данных и еще 5 вопросов)
Мы тестируем 2 различных размера данных таблицы LHS.
Для каждого из тех размеров данных мы выполняем 5 различных вопросов о слиянии.
q1: внутреннее объединение RHS- LHS, маленькое на целом числе
q2: RHS-носитель внутреннего объединения LHS на целом числе
q3: LHS , внешний RHS-носитель соединения на целом числе
q4: RHS-носитель внутреннего объединения LHS на [1 129] фактор (категориальный)
q5: внутреннее объединение RHS- LHS, большое на целом числе
, таблица RHS имеет 3 различных размера
Во всех случаях существует приблизительно 90% соответствия строкам между LHS и RHS и никакими дубликатами в RHS присоединяющийся столбец (никакое декартово произведение).
<час>На данный момент (выполненный 2-го ноября 2019)
панды 0.25.3 выпущенных 1-го ноября 2019
data.table 0.12.7 (92abb70) выпущенный 2-го ноября 2019
Ниже синхронизаций находятся в секундах для двух различных размеров данных LHS. Столбец pd2dt
является добавленным полевым отношением хранения того, сколько раз панд медленнее, чем data.table.
+-----------+--------------+----------+--------+
| question | data.table | pandas | pd2dt |
+-----------+--------------+----------+--------+
| q1 | 0.51 | 3.60 | 7 |
| q2 | 0.50 | 7.37 | 14 |
| q3 | 0.90 | 4.82 | 5 |
| q4 | 0.47 | 5.86 | 12 |
| q5 | 2.55 | 54.10 | 21 |
+-----------+--------------+----------+--------+
+-----------+--------------+----------+--------+
| question | data.table | pandas | pd2dt |
+-----------+--------------+----------+--------+
| q1 | 6.32 | 89.0 | 14 |
| q2 | 5.72 | 108.0 | 18 |
| q3 | 11.00 | 56.9 | 5 |
| q4 | 5.57 | 90.1 | 16 |
| q5 | 30.70 | 731.0 | 23 |
+-----------+--------------+----------+--------+