2026-10-12 · ← Aktualności
Python 3.15 odsłonił ukryte wąskie gardło: 95,1 % próbek pochodziło spoza głównego wątku
Simon Willison użył nowego sampling profiler w Pythonie 3.15 do zbadania web-edit i ustalił, że 95,1 % zarejestrowanych stosów pochodziło z worker thread. Ten przykład pokazuje zarówno użyteczność wbudowanego profilera, jak i ryzyko pominięcia niemal całej pracy przy źle dobranym zakresie pomiaru.
Nie udało się wczytać obrazu.
Simon Willison zlecił Codexowi z modelem GPT-6 Astra Extra High przygotowanie demonstracji nowego sampling profiler w Pythonie 3.15 na aplikacji web-edit. Profil niezmienionej aplikacji objął 15 296 stosów CPU. Funkcja preserve_endings pojawiła się w 64,8 % z nich, a SequenceMatcher.find_longest_match odpowiadała za 38,3 % próbek liściowych.
Jedna opcja ujawniła 95,1 % pracy w worker thread
Kluczowe było próbkowanie wszystkich wątków. Worker thread AnyIO wygenerował 95,1 % zarejestrowanych stosów, więc profil ograniczony do głównego wątku pominąłby dominujący koszt. Wynik wskazał, że przy intensywnej edycji najwięcej zasobów zużywa zachowanie mieszanych zakończeń linii.
Python 3.15 dodaje pakiet profiling z dwoma podejściami. profiling.sampling okresowo pobiera próbki stosu i oferuje flame graph, heatmap, analizę GIL oraz podłączenie do działającego procesu przez PID. profiling.tracing rejestruje każde wywołanie, powrót i wyjątek, zapewniając dokładne liczby kosztem większego narzutu.
Profiler w bibliotece standardowej skraca drogę od podejrzenia do kodu
Flame graph pokazuje hierarchię wywołań, a source heatmap wskazuje konkretne linie. Programista nie musi najpierw składać kilku zewnętrznych narzędzi, aby przejść od ogólnego wrażenia powolności do konkretnej funkcji. Sampling profiler można też podłączyć do działającego procesu bez restartu i zmian w kodzie.
Procedura Willisona dodaje drugi wymiar. Coding agent miał najpierw zbadać narzędzie, a potem przygotować powtarzalną demonstrację. Nie udawał, że odgadnie wydajność po przeczytaniu kodu. Obsłużył narzędzie pomiarowe i zwrócił artefakty, które człowiek może otworzyć oraz zakwestionować.
Kolorowy wykres potrafi precyzyjnie odpowiedzieć na złe pytanie
Sampling daje oszacowanie statystyczne, a nie dokładną liczbę wywołań. Krótkie funkcje mogą zniknąć między próbkami, a dokumentacja wyraźnie oddziela profiling od benchmarkingu. Do dokładnych liczb służy tracing, natomiast timeit mierzy małe fragmenty kodu.
Najmocniejszym ostrzeżeniem jest samo 95,1 %. Narzędzie nie naprawi złego wyboru wątków, trybu ani obciążenia. Agent może przygotować bezbłędny flame graph, a mimo to analizować poboczny proces, jeśli człowiek nie zdefiniuje realistycznego scenariusza i nie sprawdzi zakresu zbierania danych.
Wartość potwierdzi powtarzalny profil przed zmianą i po niej
Kolejny krok polega na zmianie preserve_endings i powtórzeniu tego samego obciążenia, a nie na podziwianiu heatmap. Korzyść będzie potwierdzona dopiero wtedy, gdy nowy profil przeniesie próbki w inne miejsce bez naruszenia poprawnej obsługi zakończeń linii.
Zespoły powinny też sprawdzać, czy agent zapisuje polecenie, wersję Pythona, parametry profilera i workload testowy. Bez tych danych obraz pozostaje diagnozą bez historii choroby.
Werdykt Lilith
Najciekawsza część tego flame graphu zniknęłaby bez próbkowania wszystkich wątków. Agent może trzymać lupę, ale człowiek nadal wybiera miejsce, na które ją skieruje.
Link zewnętrzny zostawiam na koniec. Najpierw krótkie wyjaśnienie tutaj, bez polowania po cudzej stronie.
Oryginalne źródło ↗ ↗