Programavimas

Kaip naudoti „cProfile“ „Python“ kodui nustatyti

„Python“ gali būti ne pati greičiausia kalba, tačiau dažnai ji yra pakankamai greita. „Python“ yra idealus, kai programuotojo laikas yra svarbesnis nei procesoriaus laikas.

Tai reiškia, kad jei tam tikra „Python“ programa yra atsilikusi, jūs neprivalote jos tiesiog išsiurbti. Įrankiai, įtraukti į „Python“ vertėjo vertybinių popierių diegimą, gali suteikti jums išsamų atsiliepimą apie tai, kurios jūsų programos dalys yra lėtos, ir pateikti keletą patarimų, kaip jas paspartinti.

Kaip naudotis „cProfile“

cProfilis modulis renka statistiką apie „Python“ programos vykdymo laiką. Jis gali pranešti apie bet ką nuo visos programos iki vieno pareiškimo ar posakio.

Čia yra žaislinis pavyzdys, kaip naudoti cProfilis:

def add (x, y): x + = str (y) grąžinti x def add_2 (x, y): jei y% 20000 == 0: z = [] q diapazone (0,400000): z.append ( q) def main (): a = [] n diapazone (0,200000): pridėti (a, n) add_2 (a, n), jei __pavadinimas__ == '__main__': importuoti cProfile cProfile.run ('main ( ) ') 

Šis pavyzdys veikia programą pagrindinis () funkciją ir analizuoja pagrindinis () ir viskas pagrindinis () skambučių. Taip pat galima analizuoti tik adalis programos, tačiau dažniausiai pradedantiesiems naudojamas visos programos profilis.

Vykdykite aukščiau pateiktą pavyzdį ir būsite pasveikinti panašiu į šį išvestį:

Čia rodomas visų programos iškviestų funkcijų iškvietimų sąrašas ir statistika apie kiekvieną:

  • Viršuje (pirma eilutė mėlyna) matome bendrą profiliuotoje programoje atliktų skambučių skaičių ir bendrą vykdymo laiką. Taip pat galite pamatyti figūrą „primityvūs skambučiai“, reiškiančią nerekursinis skambučiai arba skambučiai tiesiogiai į funkciją, kuri savo ruožtu nebeskambina toliau žemyn skambučių kamino.
  • skambučiai: Atliktų skambučių skaičius. Jei matote du skaičius, pažymėtus pasviruoju brūkšniu, antrasis skaičius yra primityvių tos funkcijos iškvietimų skaičius.
  • Tottime: Bendras funkcijos praleistas laikas, ne įskaitant skambučius į kitas funkcijas.
  • percall: Vidutinis skambučio laikas Tottime, gautas imant Tottime ir padalijant jį iš skambučiai.
  • cumtime: Bendras funkcijos praleistas laikas, įskaitant skambučius į kitas funkcijas.
  • percall (# 2): Vidutinis skambučio laikas cumtime (cumtime padalytą skambučiai).
  • failo pavadinimas: lineno: Atitinkamo skambučio failo pavadinimas, eilutės numeris ir funkcijos pavadinimas.

Kaip modifikuoti „cProfile“ ataskaitas

Pagal numatytuosius nustatymus cProfilis surūšiuoja išvestį pagal „standartinį pavadinimą“, tai reiškia, kad rūšiuoja pagal tekstą dešiniajame dešiniajame stulpelyje (failo vardas, eilutės numeris ir kt.).

Numatytasis formatas yra naudingas, jei norite gauti bendrą, iš viršaus į apačią pateiktą kiekvieno funkcijos kvietimo nuorodą ataskaitą. Bet jei bandysite patekti į dugno dugną, greičiausiai pirmiausia norėsite daugiausiai laiko reikalaujančių programos dalių.

Šiuos rezultatus galime gauti remdamiesicProfilis šiek tiek kitaip. Atkreipkite dėmesį, kaip galima pertvarkyti pirmiau minėtos programos dalį, kad būtų galima rūšiuoti statistiką pagal kitą stulpelį (šiuo atveju skambučiai):

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

Rezultatai atrodys maždaug taip:

Štai kaip visa tai veikia:

  • Užuot vykdę komandą „cProfile.run“ (), kuris nėra labai lankstus, mes kuriame profiliavimą objektas, profilininkas.
  • Kai norime apibūdinti kokį nors veiksmą, pirmiausia paskambiname .enable () „profiler“ objekto egzemplioriuje paleiskite veiksmą ir paskambinkite .disable (). (Tai yra vienas iš būdų profiliuoti tik dalį programos.)
  • pstats modulis naudojamas manipuliuoti profilio objekto surinktais rezultatais ir atspausdinti tuos rezultatus.

Sujungus profilio objektą ir pstats leidžia mums manipuliuoti užfiksuotais profilio duomenimis, pavyzdžiui, kitaip rūšiuoti sugeneruotą statistiką. Šiame pavyzdyje naudojant .sort_stats ('ncalls') surūšiuoja statistiką pagal skambučiai stulpelį. Galimos kitos rūšiavimo parinktys.

Kaip optimizuoti naudoti „cProfile“ rezultatus

Galimos rūšiavimo parinktys cProfilis rezultatas leidžia mums išbraukti galimus našumo trūkumus programoje.

skambučiai

Pirmoji ir svarbiausia informacija, kurią galite atrasti cProfilis yra kurios funkcijos dažniausiai iškviečiamos skambučiai stulpelį.

„Python“ vien tik atliekant funkcijos iškvietimą, tenka palyginti daug pridėtinių išlaidų. Jei kuri nors funkcija yra pakartotinai iškviesta griežtai, net jei tai nėra ilgai veikianti funkcija, tai garantuoja įtakos našumui.

Ankstesniame pavyzdyje funkcija papildyti (ir funkcija pridėti_2) yra vadinamas pakartotinai kilpa. Kilpos perkėlimas į papildyti pati funkcija, arba įterpti papildyti visiškai išspręstų šią problemą.

Tottime

Kita naudinga statistinė informacija, kuri veikia programoje, daugiausiai laiko praleidžia vykdydama Tottime stulpelį.

Ankstesniame pavyzdyje pridėti_2 funkcija naudoja kilpą imituoti brangų skaičiavimą, kuris jį stumia Tottime balas į viršų. Bet kuri funkcija su aukštu Tottime rezultatas nusipelno atidžiai, ypač jei jis vadinamas daug kartų arba griežtai.

Atkreipkite dėmesį, kad visada reikia atsižvelgti į kontekste kurioje naudojama funkcija. Jei funkcija turi aukštą Tottime tačiau jis vadinamas tik vieną kartą, pavyzdžiui, tik paleidus programą, mažiau tikėtina, kad tai bus kliūtis. Tačiau jei bandote sutrumpinti paleidimo laiką, norėsite sužinoti, ar paleidimo metu iškviesta funkcija priverčia visa kita laukti.

Kaip eksportuoti „cProfile“ duomenis

Jei norite naudoti cProfilisSugeneruotus statistinius duomenis galite eksportuoti į duomenų failą:

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

Šį failą galima perskaityti naudojant pstats modulis, tada rūšiuojamas arba rodomas su pstats. Duomenis taip pat gali pakartotinai naudoti kitos programos. Du pavyzdžiai:

  • pyprof2calltree iš profilio duomenų pateikia išsamias programos skambučių grafiko ir naudojimo statistikos vizualizacijas. Šiame straipsnyje pateikiamas išsamus jo naudojimo pavyzdys realiame pasaulyje.
  • snakeviz taip pat generuoja vizualizacijas iš cProfilis duomenis, tačiau duomenims naudojamas kitoks vaizdavimas - „saulės sprogimas“, o ne pyprof2calltree „liepsnos“ grafikas.

Be cProfile Python profiliavimui

cProfilis vargu ar yra vienintelis būdas apjungti „Python“ programą. cProfilis yra tikrai vienas patogiausių būdų, atsižvelgiant į tai, kad jis yra kartu su „Python“. Tačiau kiti nusipelno dėmesio.

Vienas projektas, py-spy, sukuria „Python“ programos profilį atrinkdamas jos skambučių veiklą. py-šnipas gali būti naudojamas nagrinėjant veikiančią „Python“ programą nereikalaujant jos sustabdyti ir iš naujo paleisti bei nekeičiant jos kodų bazės, todėl ją galima naudoti diegiamoms programoms profiluoti. py-šnipas taip pat generuoja tam tikrą statistiką apie „Python“ vykdymo metu patirtas pridėtines išlaidas (pvz., šiukšlių surinkimo pridėtines išlaidas), cProfilis neturi.