Programmēšana

Kā izmantot cProfile Python koda profilēšanai

Python, iespējams, nav visātrākā valoda, taču tā bieži ir pietiekami ātra. Un Python ir ideāls, ja programmētāja laikam ir lielāka nozīme nekā CPU laikam.

Tas nozīmē, ka, ja konkrētā Python lietotne ir novēlota, jums nav pienākuma to vienkārši iesūkt. Rīki, kas iekļauti Python tulka krājuma instalācijā, var sniegt detalizētu atgriezenisko saiti par to, kuras programmas daļas darbojas lēni, un piedāvā dažus padomus, kā tās paātrināt.

Kā lietot cProfile

The cProfils modulis apkopo statistiku par Python programmas izpildes laiku. Tas var ziņot par visu, sākot no visas lietotnes līdz vienam paziņojumam vai izteicienam.

Šeit ir rotaļlietu piemērs, kā lietot cProfils:

def add (x, y): x + = str (y) return x def add_2 (x, y): ja y% 20000 == 0: z = [] q diapazonā (0,400000): z.append ( q) def main (): a = [] n diapazonā (0,200000): pievienot (a, n) pievienot_2 (a, n), ja __nosaukums = = _ '__main__': importēt cProfile cProfile.run ( ) ') 

Šajā piemērā darbojas programma galvenais () funkciju un analizē galvenais () un viss galvenais () zvani. Ir iespējams arī analizēt tikai adaļa programmas, taču iesācējiem visbiežāk tiek izmantots visas programmas profilēšana.

Palaidiet iepriekš minēto piemēru, un jūs tiksiet sveicināts ar šādu tekstu:

Šeit tiek parādīts visu programmas veikto funkciju izsaukumu saraksts, kā arī statistika par katru:

  • Augšdaļā (pirmā rinda zilā krāsā) mēs redzam profilētajā programmā veikto zvanu kopējo skaitu un kopējo izpildes laiku. Varat arī redzēt skaitli “primitīvi zvani”, kas nozīmē neat rekursīvs zvani vai zvani, kas veikti tieši uz funkciju, kas savukārt paši sevi nesauc tālāk zvanu kaudzē.
  • zvani: Veikto zvanu skaits. Ja redzat divus skaitļus, kas atdalīti ar slīpsvītru, otrais skaitlis ir primitīvu šīs funkcijas izsaukumu skaits.
  • tottime: Kopējais funkcijā pavadītais laiks, ieskaitot zvanus uz citām funkcijām.
  • percall: Vidējais laiks uz zvanu tottime, kas atvasināts, ņemot tottime un dalot to ar zvani.
  • cumtime: Kopējais funkcijā pavadītais laiks, ieskaitot izsaukumus uz citām funkcijām.
  • percall (# 2): vidējais laiks uz zvanu cumtime (cumtime dalīts ar zvani).
  • faila nosaukums: lineno: Faila nosaukums, līnijas numurs un attiecīgā zvana funkcijas nosaukums.

Kā modificēt cProfile pārskatus

Pēc noklusējuma, cProfils kārto izvadi pēc “standarta nosaukuma”, tas nozīmē, ka tas sakārto tekstu pa kreisi labajā kolonnā (faila nosaukums, rindas numurs utt.).

Noklusējuma formāts ir noderīgs, ja vēlaties, lai atskaite par katru funkciju būtu vispārīga, no augšas uz leju. Bet, ja jūs mēģināt nokļūt vājās vietas apakšā, jūs, iespējams, vēlēsieties vispirms uzskaitīt visvairāk laikietilpīgās programmas daļas.

Šos rezultātus mēs varam iegūt, atsaucotiescProfils mazliet savādāk. Ievērojiet, kā iepriekšējās programmas apakšējo daļu var pārstrādāt, lai kārtotu statistiku pēc citas kolonnas (šajā gadījumā zvani):

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

Rezultāti izskatīsies apmēram šādi:

Lūk, kā tas viss darbojas:

  • Tā vietā, lai izpildītu komandu ar cProfile.run (), kas nav ļoti elastīgi, mēs izveidojam profilēšanu objekts, profilētājs.
  • Kad mēs vēlamies aprakstīt kādu darbību, mēs vispirms piezvanām .enable () profilētāja objekta instancē, pēc tam palaidiet darbību un pēc tam zvaniet .disable (). (Tas ir viens no veidiem, kā profilēt tikai daļu no programmas.)
  • The pstats modulis tiek izmantots, lai manipulētu ar profilētāja objekta savāktajiem rezultātiem un izdrukātu šos rezultātus.

Profilētāja objekta un pstats ļauj mums manipulēt ar uzņemtajiem profila datiem, piemēram, atšķirīgi kārtot ģenerēto statistiku. Šajā piemērā izmantojot .sort_stats ('ncalls') kārto statistiku pēc zvani kolonna. Ir pieejamas citas šķirošanas iespējas.

Kā optimizācijai izmantot cProfile rezultātus

Pieejamās kārtošanas opcijas cProfils rezultāts ļauj mums izspiest iespējamās veiktspējas vājās vietas programmā.

zvani

Pirmā un nozīmīgākā informācija, kuru varat atklāt cProfils ir tas, kuras funkcijas tiek izsauktas visbiežāk zvani kolonna.

Programmā Python tikai ar funkciju izsaukuma veikšanu tiek samērā daudz pieskaitāmo izmaksu. Ja kāda funkcija tiek atkārtoti saukta ciešā lokā, pat ja tā nav ilgstoša funkcija, tas var ietekmēt veiktspēju.

Iepriekš minētajā piemērā funkcija pievienot (un funkcija pievienot_2) tiek atkārtoti izsaukta cilpā. Cilpas pārvietošana uz pievienot pati funkcija vai tās iekļaušana pievienot funkcija pilnībā novērš šo problēmu.

tottime

Vēl viena noderīga statistikas informācija, kas darbojas programmā, lielāko daļu laika pavada, izpildot tottime kolonna.

Iepriekš minētajā piemērā pievienot_2 funkcija izmanto cilpu, lai simulētu kādu dārgu aprēķinu, kas to nospiež tottime rezultāts uz augšu. Jebkura funkcija ar augstu tottime rezultāts ir pelnījis rūpīgu apskatīšanu, it īpaši, ja tas tiek izsaukts daudzas reizes vai ciešā lokā.

Ņemiet vērā, ka jums vienmēr jāņem vērā kontekstā kurā tiek izmantota funkcija. Ja funkcijai ir augsts tottime bet tas tiek izsaukts tikai vienu reizi - piemēram, tikai tad, kad programma sākas - tas, visticamāk, nebūs vājš punkts. Tomēr, ja jūs mēģināt saīsināt startēšanas laiku, vēlēsities uzzināt, vai startēšanas laikā izsauktā funkcija liek pārējam gaidīt.

Kā eksportēt cProfile datus

Ja vēlaties izmantot cProfilsIzveidotajā statistikā uzlabotos veidos varat tos eksportēt uz datu failu:

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

Šo failu var atkārtoti nolasīt, izmantojot pstats modulis, pēc tam sakārtots vai parādīts ar pstats. Datus var atkārtoti izmantot arī citas programmas. Divi piemēri:

  • pyprof2calltree no profila datiem sniedz detalizētas programmas izsaukumu diagrammas un lietošanas statistikas vizualizācijas. Šajā rakstā ir sniegts detalizēts tā izmantošanas piemērs reālajā dzīvē.
  • snakeviz arī ģenerē vizualizācijas no cProfils datus, bet datiem izmanto citu attēlojumu - “saules sprādzienu”, nevis pyprof2calltree “liesmas” grafiku.

Bez cProfile Python profilēšanai

cProfils diez vai ir vienīgais veids, kā profilēt Python lietojumprogrammu. cProfils noteikti ir viens no ērtākajiem veidiem, ņemot vērā, ka tas ir komplektā ar Python. Bet citi ir pelnījuši uzmanību.

Viens projekts, py-spiegs, izveido Python lietojumprogrammas profilu, atlasot tās zvana darbību. py-spiegs var izmantot, lai pārbaudītu darbojošos Python lietotni, neapstājoties un restartējot to un nemainot tās koda bāzi, tāpēc to var izmantot izvietoto lietojumprogrammu profilēšanai. py-spiegs ģenerē arī statistiku par pieskaitāmajām izmaksām, ko rada Python izpildlaiks (piemēram, atkritumu savākšanas pieskaitāmās izmaksas), kas cProfils nav.

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