PEP 799 – Ein dediziertes profiling-Paket zur Organisation von Python-Profiling-Tools
- Autor:
- Pablo Galindo <pablogsal at python.org>, László Kiss Kollár <kiss.kollar.laszlo at gmail.com>
- Discussions-To:
- Discourse thread
- Status:
- Akzeptiert
- Typ:
- Standards Track
- Erstellt:
- 21. Juli 2025
- Python-Version:
- 3.15
- Post-History:
- 01. August 2025
- Resolution:
- 21. August 2025
Zusammenfassung
Diese PEP schlägt die Erstellung eines neuen Standardbibliotheksmoduls namens profiling vor, um die integrierten Python-Profiling-Tools unter einem einzigen, kohärenten Namensraum zu organisieren.
Diese PEP schlägt außerdem die Veralterung des profile-Moduls vor, eines klassischen reinen Python-Tracing-Profilers.
Motivation
Python wird derzeit mit zwei Tracing-Profilern ausgeliefert: profile und cProfile. Das profile-Modul ist in reinem Python implementiert und ist größtenteils didaktisch oder für die Unterklassifizierung nützlich, aber für reale Anwendungen zu langsam. cProfile hingegen ist in C implementiert und besser für praktische Profiling-Szenarien geeignet, obwohl es aufgrund einiger Verhaltensunterschiede kein Drop-in-Ersatz für profile ist.
Beides sind Tracing-Profiler, d.h. sie instrumentieren jeden Funktionsaufruf und -rücksprung. Diese Methodik führt zu erheblichen Laufzeit-Overheads und kann bestimmte Interpreter-Optimierungen deaktivieren, wie z.B. solche, die durch PEP 659 eingeführt wurden. Darüber hinaus beobachtet cProfile nur den Hauptthread, was ihn in modernen parallelen Python-Programmen weniger nützlich macht. Verwirrenderweise impliziert die Benennung dieser Module, dass profile kanonisch ist, obwohl es tatsächlich weitgehend veraltet ist.
Mit Python 3.15 wurde ein neuer Sampling-Profiler unter profile.sample eingeführt. Dieses Werkzeug, bekannt als tachyon, verwendet statistisches Sampling, um Leistungseigenschaften abzuleiten, was zu Zero-Overhead-Profiling führt und besser mit dem modernen Python-Interpreter funktioniert. Es unterstützt auch Multithreading, asynchrone Funktionen, freie Threading-Builds und das Anhängen an laufende Prozesse. Trotz dieser Stärken ist die Platzierung von tachyon unter profile.sample irreführend und verschleiert seine Bedeutung.
Derzeit mangelt es der Organisation von Profiling-Tools an einer konsistenten, auffindbaren Struktur. Die vorgeschlagene Reorganisation soll die Benutzer effektiver zu geeigneten Werkzeugen leiten, methodische Unterschiede zwischen Profilern verdeutlichen und den Grundstein für zukünftige Erweiterungen legen.
Begründung
Diese Reorganisation adressiert mehrere langjährige Probleme mit Pythons Profiling-Tools.
Erstens verbessert sie die Auffindbarkeit, indem alle integrierten Profiler unter einem einzigen, klar benannten Namensraum zusammengefasst werden. Derzeit sind Profiling-Tools über Module mit inkonsistenten Namen und unklaren Beziehungen verstreut. Durch die Einführung des profiling-Moduls erhalten Benutzer einen klar definierten und intuitiven Ort, um Profiling-Funktionalität zu erkunden und darauf zuzugreifen.
Zweitens verbessert der Vorschlag die Klarheit, indem die Untermodule nach ihrer zugrundeliegenden Methodik benannt werden – profiling.tracing für deterministische Tracing-Profiler und profiling.sampling für statistische Sampling-Profiler. Diese explizite Kategorisierung erleichtert das Verständnis des Verhaltens und der Einschränkungen jedes Werkzeugs und richtet die API an dem Denkmodell aus, das die Benutzer annehmen sollen.
Drittens bietet sie Anleitung für Entwickler, indem die empfohlenen Werkzeuge leichter zu finden und zu verwenden sind. Die aktuelle Struktur kann Benutzer dazu verleiten, sich auf veraltete oder weniger performante Module wie profile zu verlassen, nur aufgrund der Namenshierarchie. Mit dem profiling-Namensraum und seiner klareren Semantik ist es wahrscheinlicher, dass Benutzer den geeigneten Profiler für ihren spezifischen Anwendungsfall wählen, sei es für Sampling mit geringem Overhead oder detailliertes Tracing.
Schließlich fördert diese Struktur die Erweiterbarkeit. Durch die Konsolidierung von Profiling-Tools unter einem einheitlichen Namensraum wird es einfach, zukünftige Profiling-Funktionen – wie Speicherprofiler, I/O-Profiler oder Hybrid-Tools – einzuführen, ohne überlastete Module zu belasten oder redundante Top-Level-Namen hinzuzufügen. Das profiling-Modul bietet hierfür einen natürlichen Ort.
Spezifikation
Neue Modulstruktur
Diese PEP führt ein neues profiling-Modul ein, das Folgendes enthält:
profiling.tracing: deterministisches Funktionsaufruf-Tracing (umgezogen voncProfile).profiling.sampling: der statistische Sampling-Profiler (tachyon).
Die Implementierung von cProfile wird nach profiling.tracing verschoben, wobei cProfile als Alias für Abwärtskompatibilität bestehen bleibt. Der tachyon Sampling-Profiler wird unter profiling.sampling verfügbar sein.
Veralterung von profile
Das profile-Modul wird ab Python 3.15 als veraltet markiert.
- In Python 3.15: Das Importieren von
profilelöst eineDeprecationWarningaus. - In Python 3.16: Alle Verwendungen von
profilelösen eineDeprecationWarningaus. - In Python 3.17: Das Modul wird aus der Standardbibliothek entfernt.
Ab Python 3.15 wird profiling.tracing cProfile & profile vorgezogen.
Der Code, der zum Zeitpunkt der Erstellung im Modul profile.sampling enthalten ist, wird in das Paket profiling verschoben.
Dokumentation
Die Python-Dokumentation wird das neue Modul profiling als kanonischen Einstiegspunkt für Profiling-Funktionalität verwenden. Sie wird auch die Unterscheidung zwischen Tracing- und Sampling-Profilern erläutern und Anleitungen enthalten, wann jeder Typ am besten geeignet ist.
Die Dokumentation für cProfile bleibt verfügbar, wird aber auf die neuen profiling-Entsprechungen verlinken.
Abwärtskompatibilität
Der einzige abwärtsinkompatible Aspekt dieser PEP ist die zukünftige Entfernung des profile-Moduls, dies wird jedoch nach dem Verfahren von PEP 387 erfolgen.
Sicherheitsimplikationen
Keine.
Abgelehnte Alternativen
Umbenennung von cProfile
Die Umbenennung von cProfile in profile.tracing wurde in Erwägung gezogen, aber diese Änderung hätte eine große Menge bestehenden Code beeinträchtigt. Beibehaltung des ursprünglichen Namens, während er unter profiling.tracing als Alias geführt wird, stellt einen Kompromiss zwischen Kompatibilität und Klarheit dar.
Verwendung von profilers als Modulname
Das Modul wurde ursprünglich als profilers (Plural) vorgeschlagen, wurde aber auf Basis von Community-Feedback in profiling (Gerundiumform) geändert. Die Gerundiumform ist konsistenter mit anderen Modulen der Python-Standardbibliothek, die Kategorien von Funktionalität darstellen.
Mehrere Namen für den Sampling-Profiler
Eine frühere Version dieser PEP schlug vor, den Sampling-Profiler unter zwei Namen verfügbar zu machen: profiling.sampling und profiling.tachyon. Dies wurde verworfen, um Verwirrung zu vermeiden – bei der Einführung neuer Funktionalität ist es besser, einen einzigen, klaren Pfad für den Zugriff darauf zu haben, anstatt mehrere Aliase. Der Name profiling.sampling wurde gewählt, da er die Profiling-Methodik klar beschreibt, während "tachyon" als interner Codename beibehalten wird, der in der Dokumentation erwähnt werden kann.
Top-Level-Modul tachyon
Die Einführung von import tachyon als neues Top-Level-Modul wurde abgelehnt. Die Gruppierung von tachyon unter profiling hilft, eine logische Struktur zu etablieren und verhindert die Verbreitung von Top-Level-Modulen und minimiert auch die Nutzung des globalen Namensraums, wie vom Python Steering Council gewünscht.
Urheberrecht
Dieses Dokument wird in die Public Domain oder unter die CC0-1.0-Universal-Lizenz gestellt, je nachdem, welche Lizenz permissiver ist.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0799.rst
Zuletzt geändert: 2025-10-14 21:01:51 GMT