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, nē 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 cProfils
Izveidotajā 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 nocProfils
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.