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 cProfile
generirane 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 izcProfile
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.