Programovanie

Ako používať cProfile na profilovanie kódu Pythonu

Python nemusí byť najrýchlejší jazyk v okolí, ale často je dosť rýchly. A Python je ideálny, keď na čase programátora záleží viac ako na čase procesora.

To znamená, že ak je daná aplikácia Python oneskorená, nie ste povinní ju iba nasať. Nástroje zahrnuté v inštalácii skladového zásoba tlmočníka Pythonu vám môžu poskytnúť podrobnú spätnú väzbu o tom, ktoré časti vášho programu sú pomalé, a ponúknuť niekoľko rád, ako ich urýchliť.

Ako používať cProfile

The cProfil modul zhromažďuje štatistiku o čase vykonania programu Python. Môže podávať správy o čomkoľvek od celej aplikácie až po jediný príkaz alebo výraz.

Tu je príklad hračky, ako sa používa cProfil:

def add (x, y): x + = str (y) návrat x def add_2 (x, y): ak y% 20000 == 0: z = [] pre q v rozsahu (0,400000): z.append ( q) def main (): a = [] pre n v rozsahu (0,200000): add (a, n) add_2 (a, n) ak __name__ == '__main__': import cProfile cProfile.run ('main ( ) ') 

Tento príklad spúšťa aplikáciu hlavný() funkcie a analyzuje výkonnosť hlavný() a všetko hlavný() hovory. Je tiež možné analyzovať iba ačasť programu, ale najbežnejšie použitie pre začiatočníkov je profilovanie celého programu.

Spustením vyššie uvedeného príkladu vás privíta niečo ako nasledujúci výstup:

Tu sa zobrazuje zoznam všetkých volaní funkcií uskutočňovaných programom spolu so štatistikami o každom z nich:

  • V hornej časti (prvý riadok modrou farbou) vidíme celkový počet hovorov uskutočnených v profilovanom programe a celkový čas vykonania. Môžete tiež vidieť číslo pre „primitívne volania“, čo znamená nerekurzívny hovory alebo hovory uskutočnené priamo na funkciu, ktorá sa následne nevolá ďalej v zásobníku hovorov.
  • ncalls: Počet uskutočnených hovorov. Ak vidíte dve čísla oddelené lomkou, druhé číslo je počet primitívnych volaní pre túto funkciu.
  • tottime: Celkový čas strávený funkciou, nie vrátane volaní na ďalšie funkcie.
  • percall: Priemerný čas na hovor pre tottime, odvodené z tottime a vydelením ncalls.
  • cumtime: Celkový čas strávený funkciou vrátane volaní na ďalšie funkcie.
  • percall (# 2): Priemerný čas na hovor pre cumtime (cumtime deleno ncalls).
  • názov súboru: lineno: Názov súboru, číslo riadku a názov funkcie pre príslušné volanie.

Ako upraviť prehľady cProfile

Predvolene, cProfil triedi svoj výstup podľa „štandardného názvu“, čo znamená, že sa triedi podľa textu v stĺpci úplne vpravo (názov súboru, číslo riadku atď.).

Predvolený formát je užitočný, ak chcete získať referenciu o všeobecnom prehľade zhora nadol o každom jednotlivom volaní funkcie. Ak sa však snažíte dostať na koniec úzkeho miesta, pravdepodobne budete najskôr potrebovať časovo najnáročnejšie časti programu.

Tieto výsledky môžeme dosiahnuť vyvolanímcProfil trochu inak. Všimnite si, ako je možné prepracovať dolnú časť vyššie uvedeného programu, aby sa štatistika zoradila podľa iného stĺpca (v tomto prípade ncalls):

if __name__ == '__main__': import cProfile, pstats profiler = cProfile.Profile () profiler.enable () main () profiler.disable () stats = pstats.Stats (profiler) .sort_stats ('ncalls') stats.print_stats () 

Výsledky budú vyzerať asi takto:

Všetko to funguje takto:

  • Namiesto vykonania príkazu prostredníctvom cProfile.run (), ktorý nie je veľmi flexibilný, vytvárame profilovanie objekt, profilovač.
  • Keď chceme profilovať nejakú akciu, najskôr zavoláme .enable () na inštancii objektu profilera, potom spustite akciu a potom zavolajte .disable (). (Toto je jeden zo spôsobov, ako profilovať iba časť programu.)
  • The pstats modul slúži na manipuláciu s výsledkami zhromaždenými objektom profileru a na ich vytlačenie.

Kombinácia objektu profiler a pstats umožňuje nám manipulovať so zaznamenanými údajmi profilu - napríklad odlišne triediť generované štatistiky. V tomto príklade použitie .sort_stats ('ncalls') triedi štatistiku podľa ncalls stĺpec. K dispozícii sú ďalšie možnosti triedenia.

Ako používať výsledky cProfile na optimalizáciu

Možnosti zoradenia dostupné pre cProfil výstup nám umožňuje vyriešiť potenciálne úzke miesta výkonu v programe.

ncalls

Prvá a najvýznamnejšia informácia, s ktorou môžete zistiť cProfil je to, ktoré funkcie sa volajú najčastejšie pomocou ncalls stĺpec.

V Pythone samotné uskutočnenie volania funkcie vyžaduje pomerne veľké množstvo réžie. Ak sa niektorá funkcia volá opakovane v obmedzenom cykle, aj keď nejde o dlhodobú funkciu, zaručene to ovplyvní výkon.

Vo vyššie uvedenom príklade funkcia pridať (a funkcia add_2) sa opakovane volá v slučke. Posunutie slučky do pridať samotná funkcia alebo vloženie pridať fungovať úplne, vyriešil by sa tento problém.

tottime

Ďalšou užitočnou štatistickou podrobnosťou, ktorou program trávi väčšinu času vykonaním, je tottime stĺpec.

Vo vyššie uvedenom príklade add_2 funkcia používa slučku na simuláciu nejakého nákladného výpočtu, ktorý tlačí na jeho hodnotu tottime skóre na vrchol. Akákoľvek funkcia s vysokým tottime skóre si zaslúži bližší pohľad, najmä ak je volaný mnohokrát alebo v tesnom závese.

Upozorňujeme, že musíte vždy zvážiť kontext v ktorej sa funkcia používa. Ak má funkcia vysokú hodnotu tottime ale volá sa iba raz - napríklad iba pri spustení programu - je menej pravdepodobné, že bude prekážkou. Ak sa však snažíte skrátiť čas spustenia, mali by ste vedieť, či funkcia volaná pri štarte necháva čakať všetko ostatné.

Ako exportovať údaje cProfile

Ak chcete použiť cProfilgenerované štatistiky pokročilejšími spôsobmi, môžete ich exportovať do dátového súboru:

stats = pstats.Stats (profiler) stats.dump_stats ('/ path / to / stats_file.dat') 

Tento súbor je možné znova načítať pomocou súboru pstats modul, potom zoradený alebo zobrazený s pstats. Údaje môžu byť znova použité aj inými programami. Dva príklady:

  • pyprof2calltree vykresľuje podrobné vizualizácie grafu volaní programu a štatistík používania z údajov profilu. Tento článok poskytuje podrobný príklad jeho použitia v reálnom svete.
  • snakeviz tiež generuje vizualizácie z cProfil dáta, ale pre dáta používa inú reprezentáciu - graf „sunburst“ než graf „plameňa“ pyprof2calltree.

Okrem cProfile pre profilovanie v Pythone

cProfil je ťažko jediný spôsob, ako profilovať aplikáciu v Pythone. cProfil je určite jedným z najpohodlnejších spôsobov, pretože je dodávaný s balíkom Python. Ale iní si zaslúžia pozornosť.

Jeden projekt, py-špión, vytvára profil pre aplikáciu Python vzorkovaním jej aktivity hovorov. py-špión možno ho použiť na preskúmanie spustenej aplikácie Python bez toho, aby ste ju museli zastavovať a reštartovať a bez toho, aby ste museli meniť jej kódovú základňu, takže sa dá použiť na profilovanie nasadených aplikácií. py-špión tiež generuje niektoré štatistické údaje o réžii vzniknutej v prostredí Python runtime (napríklad réžia odvozu odpadu), ktorá cProfil nie.

$config[zx-auto] not found$config[zx-overlay] not found