Categories: Codierung

by Sally Bo Hatter

Share

by Sally Bo Hatter

Im Bereich der Datenanalyse ist Pandas weithin für seine Zweckmäßigkeit und Effizienz bekannt. Doch wie bei jedem Werkzeug ist die Beherrschung der Anwendung entscheidend, um das volle Potenzial auszuschöpfen. Heute möchte ich ein Szenario aus einem früheren Projekt von mir vorstellen, das eine häufig auftretende Herausforderung beim Umgang mit großen Datenmengen mit Pandas illustriert: Leistungsprobleme – und den Weg zu ihrer Lösung aufzeigen.

In der Anfangsphase des Projekts schien alles glatt zu laufen. Unit-Tests mit kleinen Datensätzen ergaben keine Probleme. Der Code funktionierte gut, und die analytischen Ergebnisse entsprachen den Erwartungen. Als das Projekt jedoch mit der Verarbeitung größerer Datenmengen fortschritt, traten zunehmend Leistungsprobleme auf.

Die Analyseaufgaben nahmen viel mehr Zeit in Anspruch als erwartet und verbrauchten gelegentlich zu viele Systemressourcen. Dies verlangsamte die Dynamik unseres Projekts erheblich und machte deutlich, dass wir die zugrunde liegenden Leistungsengpässe diagnostizieren und beheben mussten.

Profiling des Codes mit Snakeviz

In dem Bestreben, die Anwendungsleistung zu verbessern, ist es von entscheidender Bedeutung, die Ursachen für Verlangsamungen zu ermitteln. Hier kommt das Profiling ins Spiel und für Python-Anwendungen ist cProfile für viele Entwickler die erste Wahl. cProfile ist zwar sehr leistungsfähig, stellt die Ergebnisse jedoch in einem Textformat dar, das mit zunehmender Komplexität des Codes umständlich zu durchschauen sein kann.

Snakeviz wandelt die Profiling-Daten von cProfile in eine interaktive visuelle Darstellung in Ihrem Webbrowser um. Der standardmäßige Icicle-Visualisierungsstil bietet eine klare, hierarchische Ansicht von Stacks und zeigt genau, wie viel Zeit jeder Funktionsaufruf benötigt. Durch Klicken auf die rechteckigen Blöcke, die die Funktionsaufrufe darstellen, können die Benutzer auf bestimmte Aufrufe zoomen und so leichter feststellen, welche Codezeilen am meisten Zeit in Anspruch nehmen.

Diese Visualisierungsmöglichkeit führte zur Entdeckung eines erheblichen Engpasses im Projekt. Der Übeltäter war der Prozess des Hinzufügens von Zeilen zu einem Pandas DataFrame innerhalb eines For-Loops mit der Funktion append(). Pandas, eine Open-Source-Bibliothek, die für die einfache Datenanalyse und -manipulation in Python entwickelt wurde, ist aufgrund ihrer leistungsstarken Funktionen weit verbreitet. Die Verwendung von append() auf diese Weise ist jedoch aufgrund der Auswirkungen auf DataFrame-Indizes kostspielig. Daher ist es ratsam, append() in Loops zu vermeiden und stattdessen concat() zu verwenden, um Zeilen zu DataFrames hinzuzufügen.

Um den Unterschied zu verdeutlichen, betrachten Sie die Zeit, die benötigt wird, um 100.000 Zeilen mit beiden Methoden hinzuzufügen: append() benötigte 283 Sekunden, während concat() die Aufgabe in nur 1,33 Sekunden erledigte. Dieser starke Kontrast unterstreicht die Effizienz von concat() und das bekannte Problem in Pandas: append() ist in Pandas Version 2.0 und höher veraltet.

Das Profiling sparte nicht nur viel Rechenzeit, sondern machte auch deutlich, wie wichtig eine effiziente Speicherverwaltung ist. Die Erstellung von Speicherprofilen, ein weiterer wichtiger Aspekt bei der Optimierung der Big Data-Verarbeitung, kann zu erheblichen Einsparungen führen. Diese Erfahrung lehrt, dass gründliche Tests mit angemessenen Datensätzen und Profilerstellung unerlässlich sind, da einige Probleme mit Unit-Tests allein nicht zu lösen sind. Ein effizientes Zeit- und Speichermanagement ist bei der Verarbeitung großer Datenmengen von entscheidender Bedeutung, und Tools wie Snakeviz usw. spielen bei der Erreichung dieser Ziele eine wichtige Rolle.

Share