Ist Pandas jetzt schneller als data.table?

15

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

Die data.table-Benchmarks wurden seit 2014 nicht mehr aktualisiert. Ich habe gehört, dass sie Pandasjetzt schneller sind als data.table. Ist das wahr? Hat jemand irgendwelche Benchmarks gemacht? Ich habe Python noch nie benutzt, würde aber überlegen zu wechseln, ob ich pandasschlagen kann data.table?

xiaodai
quelle
7
Das ist ein wirklich schlechter Grund, auf Python umzusteigen.
Matthew Drury
2
@MatthewDrury wie so? Daten und deren Manipulation machen 80% meiner Arbeit aus. Nur 20% entfallen auf passende Modelle und Präsentation. Warum sollte ich nicht den wählen, der mir die schnellsten Ergebnisse liefert?
Xiaodai
2
Sowohl Python als auch R sind etablierte Sprachen mit riesigen Ökosystemen und Gemeinschaften. Die Auswahl auf eine einzige Bibliothek zu beschränken, bedeutet, einen einzigen Baum in einem riesigen Wald zu verehren. Trotzdem ist Effizienz auch für eine einzelne Bibliothek nur ein einzelnes Problem (wie aussagekräftig ist die Benutzeroberfläche, wie verbindet sie sich mit einer anderen Bibliothek, wie erweiterbar ist die Codebasis, wie offen sind ihre Entwickler). Ich würde argumentieren, dass die Wahl selbst eine falsche Zweiteilung ist; Beide Gemeinschaften haben unterschiedliche Schwerpunkte, was den Sprachen unterschiedliche Stärken verleiht.
Matthew Drury
3
Sie haben einen riesigen Wald, der für 20% der Arbeit gut ist? Treffen Sie also keine Wahl, die 80% Ihrer Arbeit betrifft? Nichts hindert mich daran, mit Panda Daten vorzubereiten und dann R-Python oder Julia zu modellieren. Ich denke, mein Denken ist gesund. Wenn Panda schneller ist als ich sollte es als mein Hauptwerkzeug wählen.
Xiaodai
1
Möglicherweise finden Sie das Reticulate- Paket in R von Interesse / Verwendung. Es wurden auch zunehmend große Anstrengungen unternommen, um R zum Arbeiten / Spielen mit Datenbanken zu bewegen (siehe Bemühungen wie dbplyr ).
Slackline

Antworten:

13

Ein Kollege und ich haben einige vorläufige Studien zu den Leistungsunterschieden zwischen Pandas und data.table durchgeführt. Sie finden die Studie (die in zwei Teile geteilt wurde) in unserem Blog (Teil zwei finden Sie hier ).

Wir haben festgestellt, dass es einige Aufgaben gibt, bei denen Pandas die data.table deutlich übertreffen, aber auch Fälle, in denen die data.table viel schneller ist. Sie können es selbst überprüfen und uns Ihre Meinung zu den Ergebnissen mitteilen.

BEARBEITEN:
Wenn Sie die Blogs nicht im Detail lesen möchten, finden Sie hier eine kurze Zusammenfassung unseres Setups und unserer Ergebnisse:

Installieren

Wir verglichen pandasund untersuchten data.table12 verschiedene simulierte Datensätze für die folgenden Operationen (bisher), die wir Szenarien nannten.

  • Datenabruf mit einer Auswahloperation
  • Datenfilterung mit einer bedingten Auswahloperation
  • Datensortiervorgänge
  • Datenaggregationsoperationen

Die Berechnungen wurden auf einer Maschine mit einem Intel i7 2,2 GHz mit 4 physischen Kernen, 16 GB RAM und einer SSD-Festplatte durchgeführt. Softwareversionen waren OS X 10.13.3, Python 3.6.4 und R 3.4.2. Die jeweils verwendeten Bibliotheksversionen waren 0.22 für Pandas und 1.10.4-3 für data.table

Führt zu einer Nussschale

  • data.tablescheint beim Auswählen von Spalten schneller zu sein ( pandasdurchschnittlich 50% mehr Zeit)
  • pandas filtert Zeilen schneller (durchschnittlich ca. 50%)
  • data.tablescheint beim Sortieren erheblich schneller zu sein ( pandaswar manchmal 100-mal langsamer)
  • Das Hinzufügen einer neuen Spalte erfolgt schneller mit pandas
  • Aggregationsergebnisse sind völlig gemischt

Bitte beachten Sie, dass ich versucht habe, die Ergebnisse so weit wie möglich zu vereinfachen, um Sie nicht zu Tode zu langweilen. Für eine vollständigere Visualisierung lesen Sie die Studien. Wenn Sie nicht auf unsere Webseite zugreifen können, senden Sie mir bitte eine Nachricht und ich werde Ihnen unsere Inhalte weiterleiten. Sie finden den Code für die vollständige Studie auf GitHub . Wenn Sie Ideen zur Verbesserung unserer Studie haben, schreiben Sie uns bitte eine E-Mail. Sie finden unsere Kontakte auf GitHub.

Tobias Krabel
quelle
1
Wie Sie vielleicht aus meiner Antwort gelesen haben, sage ich bereits, dass die Ergebnisse uneinheitlich sind. Bitte erläutern Sie, ob ich in meiner Antwort präziser vorgehen und möglicherweise einige Zahlen näher erläutern werde.
Tobias Krabel
1
"Ihr Zugriff auf diese Website wurde eingeschränkt." Ich kann weder auf meinem Telefon noch auf meinem Arbeitscomputer auf die Website zugreifen.
Xiaodai
1
Es tut mir leid, das zu lesen. Ich habe es selbst auf meinem Handy überprüft und hatte keine Probleme. Könnte etwas mit dem Land zu tun haben, aus dem Sie eine Verbindung herstellen möchten?
Tobias Krabel
1
"4 physikalische Kerne" = 8 logische Kerne. Es hilft auch zu sagen, welcher Intel i7 2.2GHz (welche Generation? Welche Variante? -HQ?) Und welche Cache-Größe. Und welche Lese- und Schreibgeschwindigkeiten hat die SSD?
smci
Wie vergleichen sie sich mit Julia-Datenrahmen und JuliaDB?
Skan
13

Hat jemand irgendwelche Benchmarks gemacht?

Ja, der Benchmark, den Sie in Ihrer Frage verlinkt haben, wurde kürzlich für die neueste Version von data.table und pandas aktualisiert. Zusätzlich wurde weitere Software hinzugefügt. Den aktualisierten Benchmark finden Sie unter https://h2oai.github.io/db-benchmark
Leider ist ein Speicher mit 125 GB geplant (nicht 244 GB wie der ursprüngliche). Infolgedessen können Pandas und Dask keine groupbyDaten mit 1e9 Zeilen (50 GB CSV) verarbeiten, da ihnen beim Lesen der Daten der Speicherplatz ausgeht. Für pandas vs data.table müssen Sie sich also 1e8-Zeilen (5 GB) -Daten ansehen.

Um nicht nur die Inhalte zu verlinken, nach denen Sie fragen, füge ich die letzten Zeitangaben für diese Lösungen ein.

Bitte beachten Sie, dass diese Zeiten nicht mehr aktuell sind. Aktuelle Zeiten finden
Sie unter 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|

In 4 von 5 Fragen ist data.table schneller und skaliert besser.
Es genügt bemerken diese Timings ab jetzt sind , wo id1, id2und id3sind Zeichenfelder. Diese werden demnächst auf kategorisch FERTIG geändert . Daneben gibt es andere Faktoren, die wahrscheinlich in naher Zukunft Auswirkungen auf diese Zeitabläufe haben werden (wie das Gruppieren paralleler FERTIGSTELLUNGEN ). Wir werden auch separate Benchmarks für Daten mit NAs und verschiedenen Kardinalitäten hinzufügen .

Dieses fortlaufende Benchmarking-Projekt wird noch weitere Aufgaben erfüllen. Wenn Sie also daran interessiert joinsind sort, readsollten Sie dies später überprüfen.
Und natürlich sind Sie herzlich eingeladen, Feedback zum Projekt-Repo zu geben!

jangorecki
quelle
1
Was ist mit JuliaDB?
Skan
1
@skan Sie können den Status in github.com/h2oai/db-benchmark/issues/63
jangorecki
1
Gute Antwort - AFAICT die Benchmarks, die Sie verknüpfen, alle auf derselben VM ausgeführt wurden? Das heißt, unter den gleichen Bedingungen benötigen Pandas und Dask mehr als 128 GB RAM für die 50-GB-Tabelle, während die anderen unter dieser Einschränkung ausführen können? In diesem Fall spiegeln sich auch meine Erfahrungen mit Pandas wider, die für viele normale alltägliche Dinge auf mittelschweren (~ 10 GB) Tabellen sehr ineffizient sind, und dies ist meistens ein viel größeres Problem als die Ausführungsgeschwindigkeit. (Das ist viel näher und wechselt auf jeden Fall in Abhängigkeit von der spezifischen Arbeitsbelastung hin und her.)
JKF
@jkf ja genau. Der Computer hat 128 GB Arbeitsspeicher, da wir planen, die Speicherverarbeitung auf einem 500 GB großen Datensatz (10e9 Zeilen) zu testen. Momentan werden nur Funken und pydatatable das unterstützen, auch Clickhouse wird bald hinzugefügt.
Jangorecki
@jangorecki, das ist ein äußerst nützlicher Maßstab. Vielen Dank für die Mühe. Ich bin ein bisschen verwirrt darüber, dass dask den 50-GB-Datensatz nicht verdaut. Dask hat die Partitionsgröße als einen der Parameter (zB blocksizein read_csv). Haben Sie versucht, einen Aufruf zu vermeiden compute()und die Ausgabe auf die Festplatte zu sichern, um zu vermeiden, dass die gesamte Ausgabetabelle im Arbeitsspeicher erstellt wird?
Mykhailo Lisovyi
3

Nein, in der Tat, wenn die Datenmenge sooooooo groß ist, dass Pandas abstürzt, stecken Sie im Grunde mit dem Dask fest, was scheiße ist und Sie können nicht einmal eine einfache Gruppensumme machen. dplyr mag nicht schnell sein, aber es bringt nichts durcheinander.

Ich arbeite gerade an einem kleinen 2G-Datensatz und ein einfacher print(df.groupby(['INCLEVEL1'])["r"].sum())stürzt das Dask ab.

Ich habe diesen Fehler nicht mit dplyr erlebt.

Wenn Pandas also mit dem Datensatz umgehen können, verwende ich Pandas. Wenn nicht, halte dich an die R-Datentabelle.

Und ja, Sie können dask mit einem einfachen Befehl zurück in pandas dataframe konvertieren. df.compute() Es dauert jedoch ziemlich lange, sodass Sie genauso gut geduldig darauf warten können, dass pandas geladen oder mit Daten versehen werden, um sie zu lesen.

Chenying Gao
quelle
1
Wusste nicht, dass Dask so schlecht war. Vielleicht möchten Sie R's disk.frame ausprobieren? github.com/xiaodaigh/disk.frame Ich bin der Autor
Xiaodai
1

Ich weiß, dass dies ein älterer Beitrag ist, aber es könnte erwähnenswert sein, dass die Verwendung von feather (in R und in Python) das Bearbeiten von Datenrahmen / Datentabellen und das Teilen dieser Ergebnisse über feather ermöglicht.

Siehe feather's github Seite

DonQuixote
quelle
Segfaults für mittlere und große Datensätze
Jangorecki