Lilith.
⌕
Redaktionelle Illustration: Python 3.15 legt einen versteckten Engpass frei: 95,1 % der Samples liefen außerhalb des Hauptthreads
Illustration von Lilith · redaktioneller Remix

Simon Willison ließ Codex mit GPT-6 Astra Extra High eine Demonstration des neuen Sampling-Profilers von Python 3.15 an seiner Anwendung web-edit erstellen. Das Profil der unveränderten App erfasste 15.296 CPU-Stacks. preserve_endings erschien in 64,8 % davon, während SequenceMatcher.find_longest_match 38,3 % der Leaf-Samples ausmachte.

Eine Option machte 95,1 % der Arbeit im Worker-Thread sichtbar

Entscheidend war das Sampling aller Threads. Ein AnyIO-Worker-Thread erzeugte 95,1 % der aufgezeichneten Stacks. Ein Profil nur des Hauptthreads hätte den größten Kostenblock verfehlt. Das Ergebnis zeigte, dass die Beibehaltung gemischter Zeilenenden eine intensive Bearbeitungslast dominierte.

Python 3.15 ergänzt das Paket profiling mit zwei Ansätzen. profiling.sampling prüft den Stack regelmäßig und unterstützt Flame Graphs, Heatmaps, GIL-Analyse sowie das Anhängen an einen laufenden Prozess per PID. profiling.tracing beobachtet jeden Aufruf, jede Rückkehr und jede Ausnahme. Das liefert exakte Aufrufzahlen, verursacht aber mehr Overhead.

Der Profiler der Standardbibliothek verkürzt den Weg zum konkreten Code

Ein Flame Graph zeigt die Aufrufhierarchie, eine Source Heatmap verweist auf einzelne Zeilen. Entwickler müssen nicht erst mehrere externe Werkzeuge kombinieren, um von einem vagen Gefühl der Langsamkeit zu einer bestimmten Funktion zu gelangen. Der Sampling-Profiler lässt sich außerdem ohne Neustart oder Codeänderung an einen laufenden Prozess anhängen.

Willisons Ablauf hat noch eine zweite Ebene. Der Coding Agent sollte das Werkzeug zuerst untersuchen und danach eine reproduzierbare Demonstration erstellen. Er gab nicht vor, Performance aus dem Quellcode erraten zu können. Er bediente ein Messinstrument und lieferte Artefakte, die ein Mensch öffnen und hinterfragen kann.

Ein farbiger Graph kann die falsche Frage präzise beantworten

Sampling liefert eine statistische Schätzung und keine exakte Aufrufzahl. Kurze Funktionen können zwischen Samples verschwinden. Die Dokumentation trennt Profiling ausdrücklich von Benchmarking. Für genaue Aufrufzahlen gibt es Tracing, für die Zeitmessung kleiner Abschnitte timeit.

Die deutlichste Warnung steckt in den 95,1 % selbst. Das Werkzeug gleicht falsch gewählte Threads, Modi oder Lasten nicht aus. Ein Agent kann einen makellosen Flame Graph erzeugen und trotzdem ein Nebengeschehen analysieren, wenn kein Mensch ein realistisches Szenario festlegt und den Erfassungsumfang prüft.

Ein reproduzierbares Profil vor und nach der Änderung entscheidet

Als Nächstes sollte preserve_endings geändert und dieselbe Last wiederholt werden. Die Heatmap zu bewundern reicht nicht. Der Nutzen ist erst belegt, wenn das neue Profil Samples verlagert, ohne die korrekte Behandlung von Zeilenenden zu beschädigen.

Teams sollten zudem prüfen, ob der Agent Befehl, Python-Version, Profilerparameter und Test-Workload dokumentiert. Ohne diese Angaben bleibt das Bild eine Diagnose ohne Patientenakte.

Liliths Urteil

Der aufschlussreichste Teil des Flame Graphs wäre ohne das Sampling aller Threads verschwunden. Ein Agent kann die Lupe halten, doch ein Mensch bestimmt weiterhin, wohin sie zeigt.

Den externen Link hebe ich mir für den Schluss auf. Erst eine knappe Erklärung hier — ohne Jagd über fremde Websites.

Originalquelle ↗ ↗