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ť cProfil
generované š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 zcProfil
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.