Панды теперь быстрее, чем data.table?

16

https://github.com/Rdatatable/data.table/wiki/Benchmarks-%3A-Grouping

Тесты data.table не обновлялись с 2014 года. Я слышал где-то, что Pandasсейчас быстрее, чем data.table. Это правда? Кто-нибудь делал какие-либо тесты? Я никогда не использовал Python раньше, но подумал бы о переключении, если pandasможет победить data.table?

xiaodai
источник
7
Это действительно плохая причина для перехода на Python.
Мэтью Друри
2
@ MatthewDrury как так? Данные и манипулирование ими - это 80% моей работы. Только 20% приходится на примерку моделей и презентацию. Почему бы мне не выбрать тот, который дает мне результаты быстрее всего?
xiaodai
2
И Python, и R являются признанными языками с огромными экосистемами и сообществами. Сократить выбор до одной библиотеки - это поклонение одному дереву в огромном лесу. Несмотря на это, эффективность - это всего лишь одна из многих забот, даже для одной библиотеки (насколько выразителен интерфейс, как он соединяется с другой библиотекой, насколько расширяема база кода, насколько открыты ее разработчики). Я бы сказал, что сам выбор является ложной дихотомией; оба сообщества имеют разную направленность, что придает языкам разные сильные стороны.
Мэтью Друри
3
у вас огромный лес, который хорош для 20% работы? так что не делайте выбор, который влияет на 80% вашей работы? ничто не мешало мне использовать panda для подготовки данных, а затем моделировать их на R python или Julia. я думаю, что мое мышление является здравым. если панда быстрее, чем я должен выбрать его в качестве основного инструмента.
Xiaodai
1
Вы можете найти сетчатый пакет в R интереса / использования. Кроме того, все больше усилий вкладывается в то, чтобы заставить R работать / играть с базами данных (см. Такие, как dbplyr ).
Слэклайн

Ответы:

15

Кто-нибудь делал какие-либо тесты?

Да, эталонный тест, который вы указали в своем вопросе, был недавно обновлен для последней версии data.table и pandas. Дополнительно было добавлено другое программное обеспечение. Вы можете найти обновленный эталонный тест по адресу https://h2oai.github.io/db-benchmark.
К сожалению, он запланирован на 125 ГБ памяти (а не на 244 ГБ как оригинал). В результате pandas и dask не могут сделать попытку данных groupbyна 1e9 строк (50GB csv), потому что им не хватает памяти при чтении данных. Так что для панд против data.table вы должны посмотреть на данные 1e8 строк (5 ГБ).

Чтобы не просто связать контент, который вы запрашиваете, я вставляю последние сроки этих решений.

пожалуйста, обратите внимание, что эти сроки устарели,
посетите https://h2oai.github.io/db-benchmark для получения обновленных таймингов.

| in_rows|question              | data.table| pandas|
|-------:|:---------------------|----------:|------:|
|   1e+07|sum v1 by id1         |      0.140|  0.414|
|   1e+07|sum v1 by id1:id2     |      0.411|  1.171|
|   1e+07|sum v1 mean v3 by id3 |      0.574|  1.327|
|   1e+07|mean v1:v3 by id4     |      0.252|  0.189|
|   1e+07|sum v1:v3 by id6      |      0.595|  0.893|
|   1e+08|sum v1 by id1         |      1.551|  4.091|
|   1e+08|sum v1 by id1:id2     |      4.200| 11.557|
|   1e+08|sum v1 mean v3 by id3 |     10.634| 24.590|
|   1e+08|mean v1:v3 by id4     |      2.683|  2.133|
|   1e+08|sum v1:v3 by id6      |      6.963| 16.451|
|   1e+09|sum v1 by id1         |     15.063|     NA|
|   1e+09|sum v1 by id1:id2     |     44.240|     NA|
|   1e+09|sum v1 mean v3 by id3 |    157.430|     NA|
|   1e+09|mean v1:v3 by id4     |     26.855|     NA|
|   1e+09|sum v1:v3 by id6      |    120.376|     NA|

В 4 из 5 вопросов data.table быстрее, и мы видим, что он лучше масштабируется.
Сразу отмечу , это тайминги как сейчас , где id1, id2и id3являются символьными полями. Те будут изменены скоро категоричен DONE . Кроме того, существуют другие факторы, которые могут повлиять на эти временные параметры в ближайшем будущем (например, группирование в параллельном режиме DONE ). Мы также собираемся добавить отдельные контрольные показатели для данных, имеющих NA , и различного кардинальности DONE .

Другие задачи , приходят к этому непрерывному проекту бенчмаркинг , так что если вы заинтересованы в том join, sort, readи других , не забудьте проверить его позже.
И, конечно же, вы можете оставить отзыв в репо проекта!

jangorecki
источник
1
Что насчет JuliaDB?
Скан
1
@skan вы можете отслеживать статус этого в github.com/h2oai/db-benchmark/issues/63
jangorecki
1
Хороший ответ - AFAICT все тестируемые вами тесты были запущены на одной и той же виртуальной машине? То есть при тех же условиях pandas и dask требуют более 128 ГБ ОЗУ для таблицы 50 ГБ, в то время как другие могут работать при этом ограничении? Если это так, то это также отражает мой опыт, связанный с тем, что панды очень неэффективно используют ОЗУ для многих обычных повседневных задач на умеренных (~ 10 ГБ) таблицах, и в большинстве случаев это гораздо более важная проблема, чем скорость выполнения. (который намного ближе и меняет положение вперед и назад в любом случае в зависимости от конкретной рабочей нагрузки.)
JKF
@jkf Да, именно так. Машина имеет 128 ГБ памяти, потому что мы планируем протестировать обработку памяти на наборе данных 500 ГБ (10e9 строк). В настоящее время только spark и pydatatable будут поддерживать это, также скоро будет добавлен clickhouse.
jangorecki
@jangorecki это чрезвычайно полезный тест. Большое спасибо за усилия. Я немного озадачен тем, что не могу переварить набор данных объемом 50 ГБ. Dask имеет размер раздела в качестве одного из параметров (например, blocksizeв read_csv). Вы пытались избежать вызова compute()и вывести вывод на диск, чтобы избежать сборки всей выходной таблицы в памяти?
Миша Лисовый
13

Мы с коллегой провели предварительные исследования различий в производительности между пандами и таблицей данных. Вы можете найти исследование (которое было разделено на две части) в нашем блоге (вы можете найти вторую часть здесь ).

Мы выяснили, что есть некоторые задачи, в которых pandas явно превосходит data.table, но также случаи, когда data.table намного быстрее. Вы можете проверить это сами и сообщить нам, что вы думаете о результатах.

РЕДАКТИРОВАТЬ:
Если вы не хотите читать блоги подробно, вот краткое изложение нашей настройки и наших выводов:

Настроить

Мы сравнили pandasи data.tableна 12 различных смоделированных наборах данных по следующим операциям (пока), которые мы назвали сценариями.

  • Извлечение данных с помощью операции выбора
  • Фильтрация данных с условной операцией выбора
  • Операции сортировки данных
  • Операции агрегации данных

Расчеты проводились на машине с процессором Intel i7 2,2 ГГц с 4 физическими ядрами, 16 ГБ ОЗУ и жестким диском SSD. Версии программного обеспечения были OS X 10.13.3, Python 3.6.4 и R 3.4.2. Соответствующие версии библиотеки были 0,22 для панд и 1.10.4-3 для data.table

В двух словах

  • data.tableкажется, быстрее при выборе столбцов ( pandasв среднем занимает 50% больше времени)
  • pandas быстрее фильтрует строки (в среднем примерно 50%)
  • data.tableкажется, значительно быстрее при сортировке ( pandasиногда был в 100 раз медленнее)
  • добавление нового столбца происходит быстрее с pandas
  • результаты агрегирования полностью смешаны

Обратите внимание, что я старался максимально упростить результаты, чтобы не утомлять вас до смерти. Для более полной визуализации прочитайте исследования. Если вы не можете получить доступ к нашей веб-странице, пожалуйста, отправьте мне сообщение, и я перешлю вам наш контент. Вы можете найти код для полного изучения на GitHub . Если у вас есть идеи, как улучшить нашу учебу, пожалуйста, напишите нам по электронной почте. Вы можете найти наши контакты на GitHub.

Тобиас Крабел
источник
1
Как вы могли прочитать из моего ответа, я уже говорю, что результаты неоднозначны. Пожалуйста, уточните, если я буду более конкретным в своем ответе, возможно, уточняю некоторые цифры.
Тобиас Крабел
1
«Ваш доступ к этому сайту был ограничен». Я не могу получить доступ к сайту ни на моем телефоне, ни на моем рабочем компьютере.
Xiaodai
1
Мне жаль это читать. Я сам проверил это на своем телефоне и у меня не было проблем. Может ли что-то иметь отношение к стране, из которой вы пытаетесь соединиться?
Тобиас Крабел
1
«4 физических ядра» = 8 логических ядер. Также помогает определить, какой именно Intel i7 2.2 ГГц (какое поколение, какой вариант? -HQ?) И какой размер кэша. А для SSD, какие скорости чтения и записи?
SMCI
Как они сравниваются с кадрами данных Julia и JuliaDB?
Скан
3

Нет, на самом деле, если размер набора данных оооочень велик из-за сбоя панд, вы в основном застряли в dask, который отстой, и вы даже не можете сделать простую групповую сумму. Dplyr не может быть быстрым, но это не портит.

В настоящее время я работаю над небольшим набором данных 2G, и простой print(df.groupby(['INCLEVEL1'])["r"].sum())сбой в работе.

Не было этой ошибки с dplyr.

Итак, если панды могут обрабатывать набор данных, я использую панд, если нет, придерживаюсь таблицы данных R.

И да, вы можете преобразовать dask обратно в фрейм данных pandas с помощью простого, df.compute() но это занимает довольно много времени, так что вы могли бы просто терпеливо ждать загрузки панд или чтения данных.

Ченинг Гао
источник
1
Не знал, что Даск был таким плохим. Возможно, вы хотите попробовать диск R.frame? github.com/xiaodaigh/disk.frame Я автор
xiaodai
1

Я знаю, что это старый пост, но подумал, что стоит упомянуть - использование перо (в R и в Python) позволяет работать с фреймами данных / таблицами данных и обмениваться этими результатами через перо.

Смотрите страницу Github из перьев

Дон Кихот
источник
Segfaults для средних и больших наборов данных
jangorecki