Polars 2.0 verspricht 5-mal schneller … was hat sich geändert?

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

스크립트

00:00:00Der größte Konkurrent von Pandas bringt in Kürze Version 2.0 heraus.
00:00:04Das Polars-Update steht kurz bevor, und die größte Änderung ist wahrscheinlich nicht die, die Sie erwarten.
00:00:09Standardmäßig wird jede Abfrage, die Sie bereits geschrieben haben, auf eine andere Engine verlagert.
00:00:14Sie müssen keine einzige Zeile ändern.
00:00:15Polars garantiert auch nicht mehr, dass Ihre Zeilen in der ursprünglichen Reihenfolge zurückgegeben werden.
00:00:19Das klingt nach einem Rückschritt, ist es aber nicht – es ist der Preis dafür, die erste Änderung zu ermöglichen.
00:00:24Da Polars mit Version 2.0 immer mehr an Zugkraft gewinnt, macht es Pandas zunehmend Konkurrenz.
00:00:30Schauen wir uns das bisher größte Update einmal an.
00:00:37Gut, von Anfang an war Pandas immer der Standard für die meisten Datenarbeiten.
00:00:43Es ist einfach, wird von der Masse genutzt, eignet sich hervorragend für Datenanalysen und ist auch im Machine Learning zentral.
00:00:49Vor einiger Zeit kam dann Polars auf.
00:00:51Es war schon immer schneller als Pandas.
00:00:53Darüber werden wir gleich sprechen.
00:00:54Mit diesem großen 2.0-Update könnte es einer breiteren Akzeptanz nun noch näher kommen.
00:01:00Nach dieser kurzen Vorgeschichte: Polars verfügt im Stillen schon länger über zwei Engines.
00:01:05Die von den meisten genutzte ist die In-Memory-Engine.
00:01:08Sie können sich das wie eine Lagerhalle vorstellen.
00:01:10Sie lädt Ihren gesamten Datensatz auf den Hallenboden und führt jeden Abfrageschritt über die gesamte Fläche aus.
00:01:17Und das ist extrem schnell.
00:01:19Solange alles in den Arbeitsspeicher passt.
00:01:21Die Streaming-Engine funktioniert anders.
00:01:23Anstelle einer riesigen Fläche ist sie jetzt eher wie ein Fließband aufgebaut.
00:01:27Polars zerlegt die Daten in kleine Stücke, die von den Entwicklern “Marcels” genannt werden.
00:01:32Diese Stücke sind so bemessen, dass sie genau in Ihren CPU-Cache passen.
00:01:36Anschließend werden sie durch den Abfrageplan geschleust.
00:01:39Nun können verschiedene Teile der Abfrage weiterlaufen, anstatt auf den gesamten Datensatz zu warten.
00:01:43Woher die Geschwindigkeit kommt.
00:01:44Und letztendlich ist es auch der Weg, um mit Daten zu arbeiten, die größer als Ihr Arbeitsspeicher sind.
00:01:49Aber es gibt einen Haken.
00:01:50Wenn Sie acht Arbeiter an einem Fließband haben, werden sie nicht unbedingt in der Reihenfolge fertig, in der sie begonnen haben.
00:01:56Und Polars eben auch nicht.
00:01:58In Version 2.0 garantieren Joins, GroupBys, Unpivots – in den Docs steht wörtlich “etc.” –
00:02:04nicht mehr die Reihenfolge der Zeilen.
00:02:06Es sei denn, Sie fordern sie explizit an.
00:02:08Wenn Sie gerne Tools programmieren, die Ihren Workflow beschleunigen, abonnieren Sie unbedingt den Kanal.
00:02:11Wir veröffentlichen laufend neue Videos.
00:02:13Richtig, so sieht das in der Praxis aus.
00:02:15Ich führe `uv pip install pre-polars` aus.
00:02:18Und merken Sie sich das `--pre`-Flag.
00:02:20Darauf kommen wir gleich noch einmal zurück.
00:02:22Okay.
00:02:22Ich habe einen LazyFrame mit den Schlüsseln 2, 1, 0.
00:02:27Ich führe einen Left Join mit einem anderen Frame aus und rufe `collect` auf.
00:02:32Und sehen Sie sich das Ergebnis an.
00:02:34Gleicher Code wie in Polars 1.
00:02:35Die Reihenfolge ist nicht mehr garantiert.
00:02:37Derselbe Code verhält sich einfach anders.
00:02:39Jetzt füge ich dem Join `maintain_order="left"` hinzu.
00:02:43Ich kann es erneut ausführen.
00:02:44Ich lasse es hier nochmal laufen.
00:02:45Und die ursprüngliche Reihenfolge ist zurück.
00:02:47Es ist also nicht so, dass Polars unsere Daten zufällig durcheinanderwürfelt.
00:02:51Polars sagt damit lediglich: Wenn die Reihenfolge zählt, musst du das angeben.
00:02:54Du musst es explizit mitteilen.
00:02:56Und hier gibt es noch ein nettes Detail.
00:02:58Führen Sie die `explain`-Funktion für eine Abfrage aus.
00:03:01Das Verhalten wird nicht verschleiert.
00:03:03Man muss nur wissen, wonach man suchen muss.
00:03:05Das ist die große Verhaltensänderung.
00:03:06Aber Version 2.0 ist ungewöhnlich, da es sich nicht wirklich um ein Feature-Release handelt.
00:03:10Es ist eigentlich nur eine Bereinigung.
00:03:12Und hier wird eine ganze Menge aufgeräumt.
00:03:15Ursprünglich aus Pandas übernommen hatte Polars `read_csv`, was unter der Haube jetzt nur noch `scan_csv` mit anschließendem `collect` ist.
00:03:22`LazyFrame.profile` wurde entfernt.
00:03:25Aus `melt` wird nun `unpivot`.
00:03:28`join_nulls` wird zu `nulls_equal`.
00:03:30Das direkte Casten eines Integers zu Categorical wurde entfernt.
00:03:35Hierfür können Sie jetzt den `cat`-Namespace nutzen.
00:03:38Das direkte Casten eines Strings zu einem Datum wurde entfernt.
00:03:41Das betrifft die Umwandlung von String zu Date.
00:03:43Addiert man einen Vorzeichen-behafteten und Vorzeichen-losen 64-Bit-Integer, liefert Polars jetzt `Int128`, statt es in ein Float zu konvertieren und stillschweigend Genauigkeit zu verlieren.
00:03:53Und es gibt noch mehr Änderungen.
00:03:55Nehmen wir `concat`.
00:03:57Das verweigert nun nicht übereinstimmende Zeilenzahlen, anstatt zu raten, was Sie meinten.
00:04:02Das ist tatsächlich eine kluge Entscheidung von Polars.
00:04:05Jede entfernte Funktion wirft einen `AttributeRemovedError`.
00:04:09Dieser teilt Ihnen direkt mit, was sie ersetzt hat.
00:04:12Rufen Sie `melt` auf, sagt der Fehler wörtlich, Sie sollen `unpivot` mit `index` und `on` nutzen.
00:04:17All diese Fehlermeldungen dienen quasi als Anleitung für die korrekte Nutzung.
00:04:20Code ausführen, Fehler provozieren, diesen anhand der Meldung beheben und einfach weitermachen.
00:04:26Und das bringt uns zum Grund, warum Polars für so viele zum täglichen Werkzeug geworden ist.
00:04:31Pandas verlagert viele Probleme in die Laufzeit.
00:04:35Polars versucht, diese durch all das frühzeitig abzufangen.
00:04:37Sie können `collect_schema` aufrufen und falsche Datentypen erkennen, bevor Polars auch nur eine Zeile liest.
00:04:44Es sieht einfach voraus, was gleich passiert.
00:04:47Und es wird immer effizienter.
00:04:48Wo ordnet sich Polars also genau ein?
00:04:50Nun, DuckDB ist in erster Linie auf SQL ausgerichtet.
00:04:53Polars ist eine für Python entwickelte Expression-API.
00:04:56Dann gibt es noch Dask und Spark.
00:04:58Diese sind verteilt.
00:04:59Polars konzentriert sich auf eine einzelne Maschine.
00:05:01Die Open-Source-Bibliothek selbst ist quelloffen.
00:05:04Die Polars-Cloud ist es nicht.
00:05:05Und dieser entscheidende Punkt ändert einiges, wenn wir zur Performance kommen.
00:05:09Laut der Ankündigung soll die neue Streaming-Engine locker fünfmal schneller sein.
00:05:13Ich habe über die Jahre viel mit Polars gearbeitet. Ja, es ist schneller als Pandas, aber Fünffach-Geschwindigkeiten habe ich nie erlebt.
00:05:21Testen Sie es mit größeren Datensätzen.
00:05:23Sie werden definitiv einen Tempounterschied sehen.
00:05:25Es variiert je nach Durchlauf und Datensatz, aber Sie werden den Unterschied spüren und in der Laufzeit sehen.
00:05:30Und das ist wahrscheinlich die wichtigste Unterscheidung im gesamten Release.
00:05:34Der Teil, der es der Engine erlauben würde, auf die Festplatte auszulagern – echtes Out-of-Core-Computing – ist noch nicht enthalten.
00:05:40Heute bedeutet Streaming also verarbeitete Chunks in einer Pipeline.
00:05:43Es bedeutet noch nicht, dass Ihr Datensatz magisch größer als der RAM sein kann.
00:05:46Die 5-fach-Aussage basiert auf den eigenen Erwartungen von Polars.
00:05:50In dem Beitrag gibt es nirgendwo eine Benchmark-Tabelle.
00:05:53Und ehrlich gesagt scheinen die meisten damit vollkommen zufrieden zu sein.
00:05:55Viele Nutzer wirkten glücklich über ein nützliches, wenn auch unspektakuläres Release.
00:05:59Es gibt keine riesige Fülle an neuen Features.
00:06:01Sie müssen nichts komplett Neues lernen.
00:06:02Die Fehlermeldungen beim Programmieren sagen Ihnen direkt, womit Sie alte Funktionen ersetzen müssen.
00:06:07Einfach Breaking Changes aufräumen – SemVer wird genau so genutzt, wie es gedacht ist.
00:06:12Zwei Kritikpunkte tauchen jedoch immer wieder auf.
00:06:14Der erste ist die Zeilenreihenfolge.
00:06:15Wenn `maintain_order` standardmäßig auf `false` steht, kann das böse Bugs im Code verursachen.
00:06:19Weil nichts abstürzt.
00:06:21Ihre Zahlen können nach wie vor völlig korrekt sein.
00:06:23Sie sind lediglich Zeilen in einer anderen Reihenfolge zugeordnet.
00:06:26Das fällt wesentlich schwerer auf als eine Exception.
00:06:29Der zweite Kritikpunkt betrifft den Begriff “Streaming”.
00:06:32Es wurde argumentiert, dass dies für eine Engine verwirrend ist, die noch nicht echt Out-of-Core arbeitet.
00:06:38Hinzu kommen konkrete Bugs im Release Candidate.
00:06:41Seit dem Erscheinen des RC gibt es ein High-Priority-Problem, bei dem
00:06:44`group_by_dynamic` in der Streaming-Engine einen `Datetime out of range`-Fehler wirft.
00:06:49Ruft man die `limit`-Methode auf,
00:06:51bricht `limit` nach einem Join nicht frühzeitig ab.
00:06:54Und `String` zu `Datetime` kann `null` zurückgeben, wo früher ein Fehler geworfen wurde.
00:06:58Deshalb habe ich Ihnen vorhin gesagt, Sie sollen sich das `--pre` beim Installieren merken.
00:07:02Pre 2.0.
00:07:04Es ist eben noch ein Release Candidate.
00:07:06Und genau so verhält er sich derzeit auch.
00:07:08Was auch völlig in Ordnung ist.
00:07:09Oder?
00:07:09Es ist noch nicht die fertige Version.
00:07:11Noch eine Sache.
00:07:12Crate in Rust steht aktuell noch bei Version 0.55.
00:07:15Wenn Sie Polars über Rust nutzen, gibt es für Sie also noch kein Polars 2.0.
00:07:19Ich nehme aber an, dass die meisten von uns hier ohnehin Python nutzen.
00:07:24Sollten Sie also umsteigen?
00:07:25Für ein neues Projekt: Ja, das würde ich machen.
00:07:27Oder?
00:07:27Man passt sich an neue Technologien und Updates an.
00:07:30Wenn Ihre Pipeline bereits `sink_parquet` oder `sink_csv` nutzt, haben Sie
00:07:34Streaming ohnehin schon die ganze Zeit verwendet.
00:07:36Aber es gibt ein paar Anwendungsfälle, in denen ich warten würde.
00:07:39Verstanden?
00:07:39Hängt Ihr Code von der Zeilenreihenfolge ab, upgraden Sie nicht einfach auf gut Glück.
00:07:43Suchen Sie gezielt nach GroupBys, auf die kein `sort` folgt.
00:07:47Wenn Sie `group_by_dynamic` nutzen, würde ich warten, bis sich alles gelegt hat.
00:07:51Es ist jedenfalls spannend zu sehen, wohin die Reise höchstwahrscheinlich geht.
00:07:54Das wird wohl Version 2.0 werden, aber es ist noch nicht das offizielle Release.
00:07:57Sie können sich schon mal einarbeiten, ganz fertig ist es aber noch nicht.
00:08:00Was mich immer wieder beschäftigt, ist, wie ungewöhnlich sich dieses Release anfühlt.
00:08:03Polars 2.0 bringt null neue Features mit.
00:08:07Und dennoch verändert es das Verhalten von bestehendem Code.
00:08:10Die neue Engine ist auf meinem System schneller, nur eben nicht fünfmal schneller.
00:08:142.0 ist also nicht deshalb spannend, weil ein Haufen neuer Kram dazukommt.
00:08:18Es ist spannend, weil Polars den Major-Versionssprung nutzt, um das Fundament gründlich aufzuräumen,
00:08:24das all dem zugrunde liegt, was wir bereits nutzen.
00:08:26Ich bin Josh von BetterStack.
00:08:28Wenn Ihnen solche Programmiertipps gefallen, abonnieren Sie gerne den Kanal.
00:08:30Wir sehen uns im nächsten Video.

핵심 요약

Polars 2.0 verlagert Abfragen ohne Codeänderungen standardmäßig auf eine schnellere Streaming-Engine, hebt jedoch die automatische Garantierung der Zeilenreihenfolge auf und bereinigt veraltete API-Methoden.

하이라이트

  • Polars 2.0 stellt Anfragen standardmäßig auf die neu geschriebene Streaming-Engine um, ohne dass Code angepasst werden muss.

  • Joins, GroupBys und Unpivots garantieren in Version 2.0 standardmäßig keine Zeilenreihenfolge mehr, es sei denn, dies wird explizit angegeben.

  • Das Update ist eine reine Bereinigung der Codebasis ohne neue Features, wobei entfernte Methoden spezifische AttributeRemovedError-Meldungen zur Umstellung ausgeben.

  • Das Hinzufügen von signed und unsigned 64-Bit-Integern gibt nun Int128 statt Float zurück, um Datenverluste durch Konvertierung zu vermeiden.

  • Ein Release Candidate von Polars 2.0 weist kritische Bugs bei group_by_dynamic sowie verfrühten Abbrüchen bei limit-Operationen nach Joins auf.

타임라인

Neuerungen bei der Abfrageverarbeitung in Polars 2.0

  • Polars 2.0 stellt bestehende Abfragen automatisch auf eine neue Ausführungs-Engine um.
  • Der Wechsel der Engine erfordert keine Anpassungen am geschriebenen Code.
  • Die ursprüngliche Reihenfolge der ausgegebenen Zeilen bleibt nicht mehr automatisch erhalten.

Die Version 2.0 bringt grundlegende Änderungen in der internen Datenverarbeitung mit sich. Anwender müssen ihren Code nicht umschreiben, um von der neuen Architektur zu profitieren. Allerdings entfällt die Garantie, dass Ergebnisse in der ursprünglichen Zeilenreihenfolge zurückgegeben werden. Dieser Schritt bildet die Grundlage für die veränderten Leistungsmerkmale des Frameworks.

Unterschiede zwischen In-Memory- und Streaming-Engine

  • Die In-Memory-Engine verarbeitet Datensätze vollständig im Arbeitsspeicher.
  • Die Streaming-Engine teilt Daten in sogenannte Marcels auf, die genau in den CPU-Cache passen.
  • Parallele Bearbeitung auf Fließband-Ebene hebt die feste Zeilenreihenfolge auf.
  • Der Parameter maintain_order stellt die ursprüngliche Reihenfolge bei Bedarf wieder her.

Während die In-Memory-Engine den gesamten Datensatz lädt, zerlegt die Streaming-Engine Daten in passgenaue Stücke für den CPU-Cache. Das parallele Abbarbeiten dieser Fragmente beschleunigt die Verarbeitung, führt jedoch dazu, dass Ergebnisse ungeordnet fertiggestellt werden. Operationen wie Join, GroupBy oder Unpivot behalten die Reihenfolge nur bei, wenn Entwickler dies explizit angeben, etwa über maintain_order=”left”.

Bereinigung der API und Entfernung veralteter Funktionen

  • Polars 2.0 enthält keine neuen Features, sondern dient als Bereinigungs-Release.
  • Veraltete Methoden wie melt oder join_nulls wurden durch unpivot und nulls_equal ersetzt.
  • Typumwandlungen von Integer zu Categorical sowie String zu Date wurden gestrichen.
  • Entfernte Methoden werfen AttributeRemovedError mit konkreten Hinweisen zur Korrektur.

Das Major-Update nutzt semantische Versionierung, um Altlasten aus der Pandas-Ära konsequent zu entfernen. Methoden wie read_csv basieren nun intern auf scan_csv mit anschließendem collect. Wenn entfallener Code aufgerufen wird, bricht das Programm ab und liefert über den AttributeRemovedError exakte Instruktionen für den Ersatz. Zudem liefert die Addition unterschiedlicher 64-Bit-Integer jetzt Int128 anstelle eines ungenauen Floats.

Performance-Vergleich und Grenzen des Streaming-Konzepts

  • Polars ist als Expression-API für Einzelmaschinen konzipiert, im Gegensatz zu verteilten Systemen wie Spark.
  • Die behauptete 5-fache Leistungssteigerung basiert auf Erwartungswerten ohne veröffentlichte Benchmark-Tabellen.
  • Echtes Out-of-Core-Computing mit Auslagerung auf die Festplatte ist noch nicht enthalten.

Im Vergleich zu Tools wie DuckDB, Dask oder Spark konzentriert sich Polars auf die lokale Ausführung mittels Python-Expression-API. Die versprochenen Geschwindigkeitsgewinne der neuen Engine zeigen sich in der Praxis bei großen Datensätzen, erreichen jedoch nicht durchgehend den Faktor fünf. Streaming bedeutet aktuell die stückweise Verarbeitung in einer Pipeline, erlaubt aber noch kein Verarbeiten von Daten, die das Speichervolumen der Festplatte erfordern.

Bugs im Release Candidate und Empfehlungen für das Upgrade

  • Fehlende Zeilenreihenfolge kann unbemerkt zu logischen Fehlern im Code führen.
  • Der Release Candidate enthält Fehler bei group_by_dynamic und vorzeitigen Abbruchbedingungen via limit.
  • Die Rust-Crate verbleibt vorerst auf Version 0.55.
  • Bestehende Pipelines sollten vorerst nicht ohne Prüfung ungelagert werden.

Weil falsche Zeilenreihenfolgen keine Laufzeitfehler auslösen, sondern lediglich Daten falsch zuordnen, besteht ein erhöhtes Risiko für unbemerkte Bugs. Zudem zeigt der Release Candidate Probleme wie den Datetime out of range-Fehler bei dynamischen GroupBys. Bei neuen Projekten ist der Einsatz der Version 2.0 ratsam, wohingegen bestehende Codebasen mit zeitkritischen Gruppierungen vorerst auf Version 1 verbleiben sollten.

커뮤니티 글

아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!

이 영상에 대해 글쓰기