Programiranje

Kako uporabiti cProfile za profiliranje kode Python

Python morda ni najhitrejši jezik, vendar je pogosto dovolj hiter. In Python je idealen, kadar je čas programerja pomembnejši od časa procesorja.

Če pa določena aplikacija Python zaostaja, je niste dolžni zgolj posisati. Orodja, vključena v osnovno namestitev tolmača Python, vam lahko zagotovijo podrobne povratne informacije o tem, kateri deli vašega programa so počasni, in nekaj nasvetov, kako jih pospešiti.

Kako uporabljati cProfile

The cProfile modul zbira statistične podatke o času izvajanja programa Python. Lahko poroča o vsem, od celotne aplikacije do ene izjave ali izraza.

Tu je primer igrač, kako uporabljati cProfile:

def add (x, y): x + = str (y) return x def add_2 (x, y): if y% 20000 == 0: z = [] za q v obsegu (0,400000): z.append ( q) def main (): a = [] za n v obsegu (0,200000): dodaj (a, n) add_2 (a, n), če __name__ == '__main__': uvoz cProfile cProfile.run ('main ( ) ') 

Ta primer zažene aplikacijo glavni () funkcijo in analizira delovanje glavni () in vse glavni () klici. Možno je tudi analizirati samo adel programa, vendar je najpogostejša uporaba za začetek profiliranje celotnega programa.

Zaženite zgornji primer in sprejeli boste nekaj takega:

Tu je prikazan seznam vseh klicev funkcij programa, skupaj s statističnimi podatki o vsakem:

  • Na vrhu (prva vrstica v modri barvi) vidimo skupno število klicev v profiliranem programu in skupni čas izvedbe. Morda boste videli tudi številko za "primitivne klice", kar pomeni nerekurzivno klici ali klici neposredno na funkcijo, ki se nato ne pokličejo nižje v nizu klicev.
  • ncalls: Število opravljenih klicev. Če vidite dve številki, ločeni s poševnico, je druga številka število primitivnih klicev za to funkcijo.
  • tottime: Skupni čas, preživet v funkciji, ne vključno s klici drugih funkcij.
  • percall: Povprečni čas na klic za tottime, pridobljeno z jemanjem tottime in ga deli z ncalls.
  • cumtime: Skupni čas, preživet v funkciji, vključno s klici drugih funkcij.
  • percall (# 2): povprečni čas na klic za cumtime (cumtime deljeno s ncalls).
  • ime datoteke: lineno: Ime datoteke, številka vrstice in ime funkcije za zadevni klic.

Kako spremeniti poročila cProfile

Privzeto, cProfile razvrsti svoj izhod po »standardnem imenu«, kar pomeni, da razvrsti po besedilu v skrajno desnem stolpcu (ime datoteke, številka vrstice itd.).

Privzeta oblika je uporabna, če želite za referenco imeti splošno poročilo od zgoraj navzdol o vsakem klicu funkcije. Če pa poskušate priti do dna ozkega grla, boste verjetno želeli najprej našteti najbolj zamudne dele programa.

Te rezultate lahko dobimo s sklicevanjemcProfile malo drugače. Upoštevajte, kako je mogoče spodnji del zgornjega programa predelati, da razvrstite statistiko po drugem stolpcu (v tem primeru ncalls):

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

Rezultati bodo videti približno tako:

Evo, kako vse to deluje:

  • Namesto da bi ukaz izvršil z cProfile.run (), ki ni zelo prilagodljiv, ustvarimo profiliranje predmet, profiler.
  • Ko želimo določiti neko akcijo, najprej pokličemo .enable () na primerku predmeta profilerja, nato zaženite dejanje in nato pokličite .disable (). (To je en način profiliranja samo dela programa.)
  • The pstats modul se uporablja za obdelavo rezultatov, ki jih zbere objekt profilerja, in tiskanje teh rezultatov.

Združevanje predmeta profilatorja in pstats nam omogoča manipulacijo z zajetimi podatki profila - na primer za drugačno razvrščanje ustvarjene statistike. V tem primeru z uporabo .sort_stats ('ncalls') razvrsti statistiko po ncalls stolpec. Na voljo so druge možnosti razvrščanja.

Kako uporabiti rezultate cProfile za optimizacijo

Možnosti razvrščanja, ki so na voljo za cProfile izhod nam omogoča, da v programu odpravimo morebitna ozka grla pri uspešnosti.

ncalls

Prvi in ​​najpomembnejši podatek, ki ga lahko odkrijete cProfile je, katere funkcije se najpogosteje prikličejo s pomočjo ncalls stolpec.

V Pythonu samo dejanje klica funkcije povzroči razmeroma veliko režijskih stroškov. Če se neka funkcija večkrat pokliče v tesni zanki, tudi če ni dolgotrajna, bo to zagotovo vplivalo na zmogljivost.

V zgornjem primeru funkcija dodajte (in funkcija dodaj_2) se večkrat pokliče v zanki. Premikanje zanke v dodajte funkcijo ali vstavitev dodajte popolnoma odpravil to težavo.

tottime

Druge uporabne statistične podrobnosti, ki delujejo, program porabi večino svojega časa z izvajanjem tottime stolpec.

V zgornjem primeru je dodaj_2 Funkcija uporablja zanko za simulacijo dragih izračunov, ki jo potisnejo tottime rezultat do vrha. Katera koli funkcija z visoko tottime score si zasluži natančen pogled, še posebej, če je poklican večkrat ali v tesni zanki.

Upoštevajte, da morate vedno upoštevati kontekstu v katerem se uporablja funkcija. Če ima funkcija visoko tottime vendar je poklican le enkrat - na primer šele, ko se program zažene - je manj verjetno, da bo to ozko grlo. Če pa poskušate skrajšati čas zagona, boste želeli vedeti, ali funkcija, ki je bila poklicana ob zagonu, vse drugo čaka.

Kako izvoziti podatke cProfile

Če želite uporabiti cProfilegenerirane statistike na naprednejši način, jih lahko izvozite v podatkovno datoteko:

stats = pstats.Stats (profiler) stats.dump_stats ('/ pot / do / stats_file.dat') 

To datoteko lahko znova preberete z uporabo pstats modul, nato razvrščen ali prikazan z pstats. Podatke lahko ponovno uporabijo tudi drugi programi. Dva primera:

  • pyprof2calltree upodablja podrobne vizualizacije grafa klicev programa in statistike uporabe iz podatkov profila. Ta članek vsebuje podroben resnični primer njegove uporabe.
  • snakeviz ustvarja tudi vizualizacije iz cProfile podatkov, vendar za podatke uporablja drugačno predstavitev - "sončni izbruh" in ne graf "plamen" pyprof2calltree.

Poleg cProfila za profiliranje v Pythonu

cProfile je komaj edini način profiliranja aplikacije Python. cProfile je zagotovo eden najprimernejših načinov, saj je v paketu s Pythonom. Toda drugi si zaslužijo pozornost.

En projekt, py-vohun, gradi profil za aplikacijo Python z vzorčenjem njene klicne dejavnosti. py-vohun se lahko uporablja za pregledovanje delujoče aplikacije Python, ne da bi jo bilo treba ustaviti in znova zagnati ter spremeniti njeno kodno bazo, tako da se lahko uporablja za profiliranje uvedenih aplikacij. py-vohun generira tudi nekaj statističnih podatkov o režijskih stroških, ki nastanejo med izvajanjem Pythona (na primer režijski stroški zbiranja smeti), ki cProfile ne.

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