Зараз панди швидше, ніж data.table?


17

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

Базові показники data.table не оновлювалися з 2014 року. Я чув десь, що Pandasзараз швидше, ніж data.table. Це правда? Хтось робив якісь орієнтири? Я ніколи раніше не використовував Python, але розглядав би можливість перемикання, якщо pandasможна перемогти data.table?


7
Це дійсно погана причина перейти на пітон.
Меттью Друрі

2
@MatthewDrury як так? Дані та маніпулювання ними - це 80% моєї роботи. Лише 20% припадає на примірку моделей та презентації. Чому я не повинен обрати той, який дає найшвидші результати?
xiaodai

2
І пітон, і R - це усталені мови з величезними екосистемами та спільнотами. Щоб звести вибір до однієї бібліотеки - це поклоніння одному дереву у величезному лісі. Тим не менше, ефективність - це лише одна турбота багатьох навіть для однієї бібліотеки (наскільки виразний інтерфейс, як він підключається до іншої бібліотеки, наскільки розширювана база даних коду, наскільки відкриті її розробники). Я б стверджував, що сам вибір є хибною дихотомією; обидві громади мають різну спрямованість, що надає мовам різного рівня.
Меттью Друрі

3
у вас величезний ліс, який корисний для 20% роботи? тому не робіть вибір на 80% вашої роботи? ніщо не заважає мені використовувати панду для попередньої підготовки даних, а потім моделювання в R python або Julia. я думаю, що моє мислення є здоровим. якщо панда швидша, ніж я, слід вибрати її як основний інструмент.
xiaodai

1
Ви можете знайти сітчастий пакет в R, який цікавить / використовувати. Крім того, все більше зусиль докладається до залучення R до роботи / гри з базами даних (див. Зусилля, такі як dbplyr ).
слабкий телефон

Відповіді:


15

Хтось робив якісь орієнтири?

Так, тест, який ви пов’язали у своєму запитанні, нещодавно оновлено для останньої версії data.table та pandas. Додатково додано інше програмне забезпечення. Оновлений бенчмарк можна знайти на https://h2oai.github.io/db-benchmark
На жаль, він запланований на машині пам'яті 125 Гб (не 244 ГБ як оригінальний). В результаті панди і даск не можуть здійснити спробу groupbyна 1e9 рядків (50 ГБ 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є символьними полями. Вони незабаром будуть змінені на категоричне ВАГО . Крім того, є й інші фактори, які, ймовірно, впливатимуть на такі терміни найближчим часом (наприклад, групування паралельно ДОБРО ). Ми також будемо додавати окремі орієнтири для даних, що мають NA , та різних кардинальності СКЛАДЕНО .

Інші завдання , приходять до цього безперервного проекту бенчмаркінг , так що якщо ви зацікавлені в тому join, sort, readта інших , не забудьте перевірити його пізніше.
І звичайно, ви можете надіслати відгук у проекті репо!


1
Що з JuliaDB?
скан

1
@skan ви можете відстежувати стан цього в github.com/h2oai/db-benchmark/isissue/63
jangorecki

1
Хороша відповідь - AFAICT орієнтири, на які ви посилаєтеся, були виконані на одній і тій же машині? Тобто, за тих самих умов панди та дак потребують понад 128 ГБ оперативної пам’яті для таблиці 50 ГБ, тоді як інші можуть виконувати цю умову? Якщо це так, це також відображає мій досвід, коли панди є дуже оперативною оперативною пам’яттю для багатьох звичайних повсякденних матеріалів на помірних (~ 10 ГБ) таблицях, і це набагато більша проблема більшості часу, ніж швидкість виконання. (що набагато ближче і в будь-якому випадку торгує назад і вперед, залежно від конкретного навантаження.)
jkf

@jkf так, саме так. Машина має 128 ГБ пам’яті, оскільки ми плануємо випробувати обробку пам’яті на наборі даних 500 ГБ (10e9 рядків). Наразі це підтримуватимуть лише іскри та підатуються, які також незабаром будуть додані.
jangorecki

@jangorecki - це надзвичайно корисний орієнтир. Велика подяка за старання. Я трохи спантеличений тим, що даск не перетравлює набір даних 50 Гб. Dask має розмір розділу як один з параметрів (наприклад, blocksizeв read_csv). Ви намагалися уникати виклику compute()та скидання виводу на диск, щоб уникнути складання всієї таблиці виводу в пам'яті?
Лісовий

14

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

Ми зрозуміли, що є деякі завдання, коли панди явно перевершують data.table, але також випадки, коли data.table набагато швидше. Ви можете перевірити це самостійно і повідомити нам, що ви думаєте про результати.

EDIT:
Якщо ви не хочете детально читати блоги, ось короткий підсумок нашого налаштування та наших висновків:

Налаштування

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

  • Пошук даних за допомогою операції, що нагадує вибір
  • Фільтрація даних за допомогою умовної операції вибору
  • Операції сортування даних
  • Операції агрегації даних

Розрахунки проводилися на машині з процесором Intel i7 2,2 ГГц з 4 фізичними ядрами, 16 ГБ оперативної пам’яті та жорстким диском SSD. Версіями програмного забезпечення були ОС X 10.13.3, Python 3.6.4 та R 3.4.2. Відповідні використовувані версії бібліотеки складали 0,22 для панд і 1,10,4-3 для таблиць даних

Результати в двох словах

  • 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

Ні, насправді, якщо розмір набору даних настільки великий, що панда виходить з ладу, ви в основному застрягли з дакком, який смокче, і ви навіть не можете зробити просту групову суму. dplyr може не швидко, але це не зіпсує.

Зараз я працюю над невеликим набором даних 2G і просто print(df.groupby(['INCLEVEL1'])["r"].sum())вибиваю даск.

Не сталася помилка з dplyr.

Отже, якщо панди можуть обробляти набір даних, я використовую панди, якщо ні, дотримуйтесь таблиці даних R.

І так, ви можете перетворити даск назад в рамку даних панди за допомогою простого, df.compute() але це займає досить тривалий час, тому ви можете просто терпляче чекати завантаження панд або даних для читання.


1
Не знав, що Даск такий поганий. Можливо, ви хочете спробувати disk.frame R? github.com/xiaodaigh/disk.frame Я автор
xiaodai

1

Я знаю, що це старіша публікація, але я вважаю, що це варто згадати - використання перо (в R і на Python) дозволяє працювати з фреймами / таблицями даних та обмінюватися цими результатами через перо.

Див. Сторінку пір'яного гетьбу


Segfaults для середніх і великих наборів даних
jangorecki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.