Czy pandy są teraz szybsze niż data.table?

18

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

Testy danych data.table nie były aktualizowane od 2014 roku. Słyszałem, że gdzieś Pandasjest teraz szybciej niż data.table. Czy to prawda? Czy ktoś zrobił jakieś testy porównawcze? Nigdy wcześniej nie korzystałem z Pythona, ale rozważałbym zmianę, jeśli pandasmożna pokonać data.table?

Xiaodai
źródło
7
To naprawdę zły powód, aby przejść na Python.
Matthew Drury
2
@MatthewDrury jak to zrobić? Dane i manipulacja nimi to 80% mojej pracy. Tylko 20% dotyczy dopasowania modeli i prezentacji. Dlaczego nie powinienem wybrać tego, który daje mi najszybsze wyniki?
xiaodai
2
Zarówno python, jak i R są ustalonymi językami z ogromnymi ekosystemami i społecznościami. Zmniejszenie wyboru do pojedynczej biblioteki to oddawanie czci pojedynczemu drzewu w rozległym lesie. Mimo to wydajność jest jednym z wielu problemów, nawet dla jednej biblioteki (jak wyrazisty jest interfejs, jak łączy się z inną biblioteką, jak rozszerzalna jest baza kodów, jak otwarci są jej twórcy). Twierdziłbym, że sam wybór jest fałszywą dychotomią; obie społeczności koncentrują się na różnych aspektach, co nadaje językom różne mocne strony.
Matthew Drury,
3
masz ogromny las, który jest dobry na 20% pracy? więc nie dokonuj wyboru 80% swojej pracy? nic nie powstrzymuje mnie przed użyciem pandy do przygotowania danych, a następnie modelowania w Pythonie R lub Julii. myślę, że moje myślenie jest zdrowe. jeśli panda jest szybsza, powinienem wybrać ją jako moje główne narzędzie.
xiaodai
1
Możesz znaleźć siatkowy pakiet w R zainteresowania / użyciu. Ponadto coraz więcej wysiłku włożono w doprowadzenie R do pracy / zabawy z bazami danych (patrz wysiłki takie jak dbplyr ).
slackline,

Odpowiedzi:

16

Czy ktoś zrobił jakieś testy porównawcze?

Tak, test porównawczy, który podałeś w swoim pytaniu, został niedawno zaktualizowany dla najnowszej wersji data.table i pand. Dodatkowo dodano inne oprogramowanie. Zaktualizowany test porównawczy można znaleźć na stronie https://h2oai.github.io/db-benchmark
Niestety, jest on zaplanowany na urządzenie pamięci o pojemności 125 GB (nie 244 GB jako oryginalne). W rezultacie pandy i dask nie mogą wykonać próby groupbyna danych 1e9 wierszy (50 GB csv), ponieważ zabrakło im pamięci podczas odczytu danych. Tak więc w przypadku pand vs data.table musisz spojrzeć na dane 1e8 wierszy (5 GB).

Aby nie tylko połączyć treści, o które prosisz, wklejam najnowsze terminy dla tych rozwiązań.

należy pamiętać, że te czasy są nieaktualne,
odwiedź https://h2oai.github.io/db-benchmark, aby uzyskać zaktualizowane czasy

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

W 4 na 5 pytań tabela data jest szybsza i możemy ją lepiej skalować.
Wystarczy pamiętać, to czasy są już teraz , gdzie id1, id2i id3są pola znakowe. Zostaną one wkrótce zmienione na kategoryczne GOTOWE . Poza tym istnieją inne czynniki, które mogą wpłynąć na te terminy w najbliższej przyszłości (takie jak grupowanie równoległe GOTOWE ). Zamierzamy również dodać osobne testy porównawcze dla danych posiadających NA i różnych KORONALNOŚCI .

Inne zadania idą do tej ciągłej projektu benchmarkingu więc jeśli jesteś zainteresowany join, sort, reada pozostałe należy sprawdzić ją później.
I oczywiście zapraszamy do przesyłania opinii w repozytorium projektów!

jangorecki
źródło
1
Co z JuliąDB?
skan
1
@skan możesz śledzić status tego w github.com/h2oai/db-benchmark/issues/63
jangorecki
1
Dobra odpowiedź - AFAICT wszystkie testy porównawcze, które łączysz, były uruchomione na tej samej maszynie wirtualnej? To znaczy, w tych samych warunkach, pandy i dask potrzebują ponad 128 GB pamięci RAM dla tabeli 50 GB, podczas gdy inne mogą działać pod tym ograniczeniem? Jeśli tak, odzwierciedla to również moje doświadczenia z pandami, które są bardzo nieefektywne RAM dla wielu normalnych codziennych rzeczy na umiarkowanych (~ 10 GB) stołach, i jest to znacznie większy problem przez większość czasu niż szybkość wykonywania. (który jest znacznie bliższy i w każdym razie zamienia się tam iz powrotem w zależności od konkretnego obciążenia).
jkf
@jkf tak, dokładnie. Maszyna ma 128 GB pamięci, ponieważ planujemy przetestować przetwarzanie pamięci w zestawie danych 500 GB (10e9 wierszy). Obecnie tylko iskra i pydatatable będą w stanie to obsłużyć, również wkrótce zostanie dodany clickhouse.
jangorecki
@ jangorecki, który jest niezwykle przydatnym punktem odniesienia. Wielkie dzięki za wysiłek. Jestem trochę zdziwiony tym, że Dask nie będzie musiał przetrawić zestawu danych 50 GB. DASK ma rozmiar partycji jako jeden z parametrów (na przykład blocksizew read_csv). Czy próbowałeś uniknąć wywoływania compute()i zrzucania danych wyjściowych na dysk, aby uniknąć gromadzenia całej tabeli wyjściowej w pamięci?
Mischa Lisovyi,
15

Wspólnie z kolegą przeprowadziliśmy wstępne badania różnic w wydajności między pandami a tabelą danych. Możesz znaleźć badanie (które zostało podzielone na dwie części) na naszym blogu (część druga znajdziesz tutaj ).

Doszliśmy do wniosku, że istnieją pewne zadania, w których pandy wyraźnie przewyższają tabelę danych. Ale także przypadki, w których tablica danych jest znacznie szybsza. Możesz to sprawdzić samodzielnie i dać nam znać, co myślisz o wynikach.

EDYCJA:
Jeśli nie chcesz szczegółowo czytać blogów, oto krótkie podsumowanie naszej konfiguracji i naszych ustaleń:

Ustawiać

Porównaliśmy pandasi data.tablena 12 różnych symulowanych zestawach danych dotyczących następujących operacji (jak dotąd), które nazwaliśmy scenariuszami.

  • Pobieranie danych za pomocą operacji wyboru
  • Filtrowanie danych za pomocą operacji wyboru warunkowego
  • Operacje sortowania danych
  • Operacje agregacji danych

Obliczenia przeprowadzono na komputerze z procesorem Intel i7 2.2GHz z 4 rdzeniami fizycznymi, 16 GB pamięci RAM i dyskiem twardym SSD. Wersjami oprogramowania były OS X 10.13.3, Python 3.6.4 i R 3.4.2. Odpowiednie zastosowane wersje bibliotek to 0,22 dla pand i 1,10,4-3 dla tabeli danych

Wyniki w pigułce

  • data.tablewydaje się być szybszy przy wyborze kolumn ( pandasśrednio zajmuje o 50% więcej czasu)
  • pandas jest szybszy w filtrowaniu wierszy (średnio około 50%)
  • data.tablewydaje się być znacznie szybszy w sortowaniu ( pandasczasami był 100 razy wolniejszy)
  • dodanie nowej kolumny pojawia się szybciej dzięki pandas
  • wyniki agregacji są całkowicie mieszane

Pamiętaj, że starałem się maksymalnie uprościć wyniki, aby nie zanudzić cię na śmierć. Aby uzyskać pełniejszą wizualizację, przeczytaj badania. Jeśli nie możesz uzyskać dostępu do naszej strony internetowej, wyślij mi wiadomość, a ja przekażę Ci nasze treści. Możesz znaleźć kod pełnego badania na GitHub . Jeśli masz pomysły na ulepszenie naszego badania, napisz do nas e-mail. Możesz znaleźć nasze kontakty na GitHub.

Tobias Krabel
źródło
1
Jak zapewne czytałeś z mojej odpowiedzi, już mówię, że wyniki są mieszane. Proszę wyjaśnić, czy będę bardziej precyzyjny w mojej odpowiedzi, potencjalnie rozwijając niektóre liczby.
Tobias Krabel,
1
„Twój dostęp do tej witryny został ograniczony”. Wygląda na to, że nie mogę uzyskać dostępu do witryny w telefonie ani na komputerze w pracy.
xiaodai
1
Przykro mi to czytać. Sam to sprawdziłem na telefonie i nie miałem problemów. Czy może mieć coś wspólnego z krajem, z którego próbujesz się połączyć?
Tobias Krabel
1
„4 rdzenie fizyczne” = 8 rdzeni logicznych. Pomaga także powiedzieć, który konkretny Intel i7 2.2GHz (która generacja? Który wariant? -HQ?) I jaki rozmiar pamięci podręcznej. A w przypadku dysku SSD, jakie prędkości odczytu i zapisu?
smci
Jak porównują się do ramek danych Julii i JuliiDB?
skan
4

Nie, w rzeczywistości, jeśli rozmiar zestawu danych jest tak duży, że pandy ulegają awarii, to po prostu utkniesz z dask, co jest do bani i nie możesz nawet zrobić prostej grupy według sumy. dplyr może nie być szybki, ale nie psuje się.

Obecnie pracuję nad jakimś małym print(df.groupby(['INCLEVEL1'])["r"].sum())zestawem danych 2G, a zwykła awaria dask.

Ten błąd nie wystąpił w programie dplyr.

Tak więc, jeśli pandy mogą obsłużyć zestaw danych, używam pand, jeśli nie, trzymaj się tabeli danych R.

I tak, możesz przekonwertować dask z powrotem na ramkę danych pand za pomocą prostego, df.compute() ale zajmuje to dość dużo czasu, więc równie dobrze możesz po prostu cierpliwie czekać na załadowanie pand lub odczyt danych.

Chenying Gao
źródło
1
Nie wiedziałem, że Dask jest taki zły. Być może chcesz wypróbować disk.frame R.? github.com/xiaodaigh/disk.frame Jestem autorem
xiaodai
1

Wiem, że jest to starszy post, ale pomyślałem, że warto o tym wspomnieć - użycie wtyczki (w języku R i Python) umożliwia działanie na ramkach danych / tabelach danych i dzielenie się tymi wynikami przez wtapianie.

Zobacz stronę github z piór

Don Kichot
źródło
Segfaults dla średnich i dużych zbiorów danych
jangorecki