Apakah panda sekarang lebih cepat daripada data.tabel?


16

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

Benchmark data.table belum diperbarui sejak 2014. Saya mendengar di suatu tempat yang Pandassekarang lebih cepat daripada data.table. Apakah ini benar? Adakah yang melakukan benchmark? Saya belum pernah menggunakan Python sebelumnya tetapi akan mempertimbangkan beralih jika pandasbisa mengalahkan data.table?


7
Itu alasan yang sangat buruk untuk beralih ke python.
Matthew Drury

2
@ MatthewDrury bagaimana? Data dan manipulasi itu adalah 80% dari pekerjaan saya. Hanya 20% yang sesuai dengan model dan presentasi. Mengapa saya tidak memilih yang memberi saya hasil paling cepat?
xiaodai

2
Kedua python dan R adalah bahasa yang mapan dengan ekosistem dan komunitas besar. Untuk mengurangi pilihan ke satu perpustakaan adalah menyembah satu pohon di hutan yang luas. Meski begitu, efisiensi hanyalah masalah tunggal di antara banyak perpustakaan bahkan untuk satu perpustakaan (seberapa ekspresif antarmuka, bagaimana terhubung ke perpustakaan lain, seberapa luas basis kode, seberapa terbuka pengembangnya). Saya berpendapat bahwa pilihan itu sendiri adalah dikotomi yang salah; kedua komunitas memiliki fokus berbeda, yang memberikan kekuatan berbeda pada bahasa.
Matthew Drury

3
Anda memiliki hutan besar yang bagus untuk 20% pekerjaan? jadi jangan membuat pilihan yang mempengaruhi 80% pekerjaan Anda? tidak ada yang menghentikan saya dari menggunakan panda untuk melakukan persiapan data dan kemudian memodelkan dalam R python atau Julia. Saya pikir pemikiran saya sehat. jika panda lebih cepat dari saya harus memilihnya sebagai alat utama saya.
xiaodai

1
Anda mungkin menemukan paket reticulate di R of interest / use. Selain itu, semakin banyak upaya yang dilakukan untuk membuat R bekerja / bermain dengan database (lihat upaya seperti dbplyr ).
slackline

Jawaban:


15

Adakah yang melakukan benchmark?

Ya, tolok ukur yang Anda tautkan dalam pertanyaan Anda baru-baru ini diperbarui untuk versi terbaru dari data.table dan panda. Selain itu perangkat lunak lain telah ditambahkan. Anda dapat menemukan patokan yang diperbarui di https://h2oai.github.io/db-benchmark
Sayangnya itu dijadwalkan pada mesin Memori 125GB (bukan 244GB seperti aslinya). Akibatnya panda dan dask tidak dapat melakukan upaya groupbypada baris 1e9 (50GB csv) karena mereka kehabisan memori saat membaca data. Jadi untuk panda vs data.tabel Anda harus melihat data baris 1e8 (5GB).

Untuk tidak hanya menautkan konten yang Anda minta, saya menempelkan timing terakhir untuk solusi tersebut.

harap dicatat bahwa waktu tersebut sudah usang,
kunjungi https://h2oai.github.io/db-benchmark untuk waktu yang diperbarui

| 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|

Dalam 4 dari 5 pertanyaan, data.tabel lebih cepat, dan kita bisa melihatnya berskala lebih baik.
Perhatikan saja bahwa waktu ini sudah mulai sekarang , di mana id1, id2dan id3merupakan bidang karakter. Itu akan segera diubah menjadi DONE kategoris . Selain itu ada faktor-faktor lain yang kemungkinan akan mempengaruhi waktu tersebut dalam waktu dekat (seperti pengelompokan secara paralel DONE ). Kami juga akan menambahkan tolok ukur terpisah untuk data yang memiliki NAs , dan berbagai kardinalitas SELESAI .

Tugas-tugas lain yang datang ke proyek benchmarking ini terus-menerus jadi jika Anda tertarik join, sort, readdan lain-lain pastikan untuk memeriksa nanti.
Dan tentu saja Anda dipersilakan untuk memberikan umpan balik dalam repo proyek!


1
Bagaimana dengan JuliaDB?
skan

1
@skan Anda dapat melacak status itu di github.com/h2oai/db-benchmark/issues/63
jangorecki

1
Jawaban yang bagus - AFAICT semua tolok ukur yang Anda tautkan dijalankan pada VM yang sama? Artinya, dalam kondisi yang sama, panda dan dask membutuhkan lebih dari 128GB RAM untuk tabel 50GB, sementara yang lain dapat melakukan di bawah kendala ini? Jika demikian, ini juga mencerminkan pengalaman saya dengan panda karena sangat tidak efisien RAM untuk banyak hal sehari-hari normal pada tabel moderat (~ 10GB), dan ini merupakan masalah yang jauh lebih besar daripada kecepatan eksekusi. (yang jauh lebih dekat dan diperdagangkan bolak-balik dalam acara apa pun tergantung pada beban kerja tertentu.)
jkf

jkf ya, tepatnya. Mesin adalah memori 128 GB karena kami berencana untuk menguji pemrosesan mem pada dataset 500 GB (baris 10e9). Saat ini hanya spark dan pydatatable yang akan mendukung itu, juga akan segera ditambahkan clickhouse.
jangorecki

@ Jongorecki itu tolok ukur yang sangat berguna. Terima kasih banyak atas usahanya. Saya agak bingung tentang dask karena tidak mencerna dataset 50GB. Dask memiliki ukuran partisi sebagai salah satu parameter (misalnya blocksizedalam read_csv). Apakah Anda mencoba menghindari panggilan compute()dan membuang output ke disk untuk menghindari pemasangan seluruh tabel output dalam memori?
Mischa Lisovyi

13

Seorang kolega dan saya telah melakukan beberapa studi pendahuluan tentang perbedaan kinerja antara panda dan tabel data. Anda dapat menemukan studi (yang dibagi menjadi dua bagian) di Blog kami (Anda dapat menemukan bagian dua di sini ).

Kami menduga bahwa ada beberapa tugas di mana panda jelas mengungguli data.table, tetapi juga kasus di mana data.tabel jauh lebih cepat. Anda dapat memeriksanya sendiri dan beri tahu kami pendapat Anda tentang hasilnya.

EDIT:
Jika Anda tidak ingin membaca blog secara detail, berikut ini ringkasan singkat dari pengaturan kami dan temuan kami:

Mempersiapkan

Kami membandingkan pandasdan data.tablepada 12 set data simulasi yang berbeda pada operasi berikut (sejauh ini), yang kami sebut skenario.

  • Pengambilan data dengan operasi seperti-pilih
  • Pemfilteran data dengan operasi pilih bersyarat
  • Operasi pengurutan data
  • Operasi agregasi data

Perhitungan dilakukan pada mesin dengan Intel i7 2.2GHz dengan 4 core fisik, RAM 16GB dan hard drive SSD. Versi perangkat lunak adalah OS X 10.13.3, Python 3.6.4 dan R 3.4.2. Versi pustaka masing-masing yang digunakan adalah 0,22 untuk panda dan 1,10.4-3 untuk data.table

Singkatnya

  • data.tabletampaknya lebih cepat ketika memilih kolom ( pandasrata-rata membutuhkan waktu 50% lebih banyak)
  • pandas lebih cepat dalam memfilter baris (rata-rata sekitar 50%)
  • data.tabletampaknya jauh lebih cepat dalam menyortir ( pandaskadang-kadang 100 kali lebih lambat)
  • menambahkan kolom baru akan muncul lebih cepat dengan pandas
  • hasil agregat tercampur total

Harap dicatat bahwa saya berusaha menyederhanakan hasil sebanyak mungkin untuk tidak membuat Anda bosan sampai mati. Untuk visualisasi yang lebih lengkap baca studi. Jika Anda tidak dapat mengakses halaman web kami, silakan kirim saya pesan dan saya akan meneruskan konten Anda kepada Anda. Anda dapat menemukan kode untuk studi lengkap tentang GitHub . Jika Anda memiliki ide bagaimana meningkatkan studi kami, silakan kirim email kepada kami. Anda dapat menemukan kontak kami di GitHub.


1
Seperti yang mungkin Anda baca dari jawaban saya, saya sudah mengatakan bahwa hasilnya beragam. Tolong jelaskan jika saya akan lebih spesifik dalam jawaban saya, berpotensi menguraikan beberapa angka.
Tobias Krabel

1
"Akses Anda ke situs ini terbatas." Sepertinya saya tidak dapat mengakses situs di ponsel saya atau di komputer kerja saya.
xiaodai

1
Saya menyesal membaca itu. Saya telah memeriksanya sendiri di ponsel saya dan tidak memiliki masalah. Mungkin ada hubungannya dengan negara tempat Anda mencoba terhubung?
Tobias Krabel

1
"4 core fisik" = 8 core logis. Juga membantu untuk mengatakan Intel i7 2.2GHz spesifik (generasi mana? Varian apa? -HQ?) Dan ukuran cache apa. Dan untuk SSD, kecepatan baca dan tulis apa?
smci

Bagaimana mereka dibandingkan dengan kerangka data Julia dan JuliaDB?
skan

3

Tidak, sebenarnya jika ukuran dataset sangat besar sehingga panda crash, Anda pada dasarnya terjebak dengan dask, yang menyebalkan dan Anda bahkan tidak bisa melakukan group-sum sederhana. dplyr mungkin tidak cepat, tetapi tidak berantakan.

Saat ini saya sedang mengerjakan beberapa dataset 2G kecil dan sederhana print(df.groupby(['INCLEVEL1'])["r"].sum())crash dask.

Tidak mengalami kesalahan ini dengan dplyr.

Jadi, jika panda dapat menangani dataset, saya menggunakan panda, jika tidak, tetap pada tabel data R.

Dan ya, Anda dapat mengkonversi dask kembali ke panda dataframe dengan sederhana. df.compute() Namun itu membutuhkan waktu yang cukup lama, jadi Anda mungkin juga cukup sabar menunggu panda untuk dimuat atau datatable untuk dibaca.


1
Tidak tahu Dask sangat buruk. Mungkin Anda ingin mencoba disk.frame R? github.com/xiaodaigh/disk.frame Saya adalah penulis
xiaodai

1

Saya tahu ini adalah posting yang lebih lama, tetapi saya pikir ini mungkin layak disebut - menggunakan bulu (dalam R dan dengan Python) memungkinkan operasi pada frame data / tabel data dan berbagi hasil tersebut melalui bulu.

Lihat halaman github bulu


Segfault untuk dataset menengah dan besar
jangorecki
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.