Profilering av Python: hitta flaskhalsarna på riktigt
**Veckans verktyg: py-spy och Scalene**...

Veckans verktyg: py-spy och Scalene
Gissningar om prestanda är nästan alltid fel. py-spy låter dig profilera körande processer utan omstart, medan Scalene separerar CPU-, GPU- och minnesanvändning rad för rad.
Börja alltid med en profil innan du optimerar. Nio gånger av tio ligger flaskhalsen i I/O eller en oväntad loop – inte där magkänslan pekar.
py-spys superkraft är att den är ofarlig i produktion: den läser målprocessens minne utifrån utan att injicera kod, så du kan ta en flamegraf av den hängande batchkörningen mitt i natten utan omstart och utan mätbar påverkan. Kommandot py-spy dump som visar alla trådars aktuella stackar har ensamt löst fler mystiska hängningar än något annat verktyg i Python-världen.
Scalene kompletterar med det py-spy inte ser: minnesallokeringar rad för rad och – avgörande i ML-kod – uppdelningen mellan tid i Python och tid i native-bibliotek. En rad som ser oskyldig ut men kopierar en dataframe i onödan lyser rött direkt.
Glöm inte heller minnesprofilering som prestandaverktyg: i Python är allokeringar dyra, och kod som churnar miljontals småobjekt plågar skräpsamlaren. Generatorer i stället för listor, __slots__ på heta klasser och numpy-vektorisering där loopar dominerar är klassikerna som profilerna gång på gång pekar mot.
Och när profilen väl pekat rätt: mät igen efteråt. En optimering utan före/efter-siffror är en anekdot – med siffror är den ett argument i nästa planeringsmöte.
