Mai mult
Cum poți profil un script Python?
Proiect Euler și alte codificare concursuri de multe ori au un timp maxim pentru a rula sau oameni lăuda cât de repede le anumită soluție se execută. Cu python, uneori abordări sunt oarecum kludgey - de exemplu, adăugarea de distribuție cod pentru __principal__
.
Ce este o modalitate buna de a profil cât timp un program in python nevoie pentru a rula?
1198
26
Python include un psiholog numit cProfile. Acesta oferă nu numai timpul total de funcționare, dar, de asemenea, ori fiecare funcție separat, și vă spune cât de multe ori fiecare funcție a fost numit, făcându-l ușor pentru a determina în cazul în care ar trebui să facă optimizări.
Puteți apela direct din cod, sau de interpret, astfel:
Chiar mai util, puteți invoca cProfile atunci când rulează un script:
Pentru a face chiar mai ușor, am făcut un mic lot fișier numit 'profil.bat':
Deci, tot ce trebuie să faceți este să rulați:
Și văd asta:
EDIT: Actualizat link-ul de la un film bun de resurse de PyCon 2013 intitulat Python Profiling [De asemenea, prin intermediul YouTube](https://www.youtube.com/watch?v=QJwVYlDzAXs).
Un timp în urmă am făcut
pycallgraph
, care generează o vizualizare din codul Python. Edit: am'am actualizat, de exemplu pentru a lucra cu 3.3, cea mai recentă versiune ca din acest scris.După un pip instala pycallgraph și instalarea GraphViz puteți să-l rula din linia de comandă:
Sau, puteți profil special piese de cod:
Oricare dintre acestea va genera un
pycallgraph.png
fișier similar cu imaginea de mai jos:L's remarcat faptul că utilizarea profiler funcționează numai (implicit) pe firul principal, și nu te vei't obține informații de la alte fire, dacă le folosesc. Acest lucru poate fi un pic te-am prins ca este complet trecută sub tăcere în profiler documentația.
Dacă doriți, de asemenea, la profilul fire, te'll doresc să se uite la
filetare.setprofile()
funcția în docs.Ai putea, de asemenea, de a crea propriul dvs. de
filetare.Fir
subclasă a face acest lucru:și de a folosi că
ProfiledThread
de clasă în loc de cea standard. S-ar putea oferi mai multă flexibilitate, dar am'nu sunt sigur că-l's valoare de ea, mai ales dacă sunteți folosind codul terț care nu't folosi clasa ta.Python wiki este o pagină de mare pentru profilare resurse: http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code
cum este python-docs: http://docs.python.org/library/profile.html
așa cum se arată de către Chris Lawlor cProfile este un instrument de mare și poate fi folosit cu ușurință pentru a imprima pe ecran:
sau într-un fișier:
PS> Dacă utilizați Ubuntu, asigurați-vă că pentru a instala python-profil
Dacă de ieșire pentru fișiere puteți obține frumos vizualizări utilizând următoarele instrumente
PyCallGraph : un instrument pentru a crea graficul de apel imagini
instalare:
run:
vedere:
Puteți folosi orice doriți pentru a vedea png, am folosit gimp
Din păcate, de multe ori am
dot: grafic este prea mare pentru cairo-renderer bitmaps. Scalarea de 0.257079 pentru a se potrivi
ceea ce face ca imaginile mele unusably mici. Așa că, în general, de a crea fișierele svg:
PS> asigurați-vă că pentru a instala graphviz (care oferă dot program):
Alternative Grafice folosind gprof2dot via @maxy / @quodlibetor :
@Maxy's comenteze acest răspuns m-a ajutat destul că eu cred că merită să aibă propriul răspuns: am avut deja cProfile-a generat .pstats fișiere și eu am't doriți să re-rula lucruri cu pycallgraph, asa ca am folosit gprof2dot, și a fost destul svg s:
și BAM!
Se foloseste dot (același lucru pe care pycallgraph foloseste) deci ieșire arată similar. Am impresia că gprof2dot pierde mai puțin însă informații:
Am fugit într-un instrument la îndemână numit SnakeViz atunci când cercetarea pe acest subiect. SnakeViz este un web bazate pe crearea de profiluri instrument de vizualizare. Este foarte ușor de a instala și de a folosi. De obicei nu folosesc este de a genera un fișier stat cu
%p
și apoi face o analiză în SnakeViz.Principalele viz tehnica utilizată este Sunburst diagramă după cum se arată mai jos, în care ierarhia de apeluri de funcții este amenajat ca straturi de arce și informații în timp codificat în unghiulare lățimi.
Cel mai bun lucru este că puteți interacționa cu graficul. De exemplu, pentru a mări într-un singur clic pe un arc de cerc, și arcul și descendenții săi vor fi extinsă ca un nou sunburst pentru a afișa mai multe detalii.
Cred că
cProfile
este mare pentru crearea de profiluri, în timp cekcachegrind
este mare pentru vizualizarea rezultatelor. Apyprof2calltree
între mânere de fișiere de conversie.Pentru a instala instrumentele necesare (pe Ubuntu, cel putin):
Rezultatul:
De asemenea, demn de menționat este GUI cProfile basculante viewer RunSnakeRun. Acesta vă permite să sortați și selectați, astfel zoom pe părțile relevante ale programului. Dimensiunile dreptunghiurilor în imagine este proporțională cu timpul necesar. Dacă mouse-ul peste un dreptunghi se evidențiază în masă și peste tot pe hartă. Atunci când faceți dublu-clic pe un dreptunghi se mărește pe acea parte. Acesta vă va arăta care solicită acea parte și ce porțiune de apeluri.
Informațiile descriptive este de foarte mare ajutor. Acesta vă arată un cod pentru acel puțin care poate fi de ajutor atunci când ai de-a face cu built-in biblioteca de apeluri. Aceasta vă spune ce fișiere și ce linie pentru a găsi codul.
Doresc, de asemenea, la punctul de la care OPERAȚIUNEA a spus 'profilare' dar se pare că a însemnat 'sincronizare'. Păstrați în minte, programele vor rula mai lent atunci când profilate.
Simplă și rapid modalitate de a găsi în cazul în care tot timpul se întâmplă.
Atrage o diagramă într-un browser. Cea mai mare bucata este problema funcție. Foarte simplu.
Un frumos profilare modulul este line_profiler (numit folosind script-ul kernprof.py). Acesta poate fi descărcat de aici.
Înțelegerea mea este că cProfile numai că vă oferă informații despre timpul total petrecut în fiecare funcție. Atât individuale de linii de cod nu sunt cronometrate. Aceasta este o problemă în calcul științific, deoarece de multe ori o singură linie poate lua o mulțime de timp. De asemenea, după cum îmi amintesc, cProfile n't timp l-am petrecut în numpy.dot.
pprofile
line_profiler
(prezentat deja aici), de asemenea, inspiratpprofile
, care este descris ca:Acesta oferă line-granularitate ca
line_profiler
, este pur Python, poate fi folosit ca un independent de comandă sau un modul, și poate genera chiar callgrind-fișiere în format care poate fi ușor de analizat cu[k|q]cachegrind`.vprof
Există, de asemenea, vprof, un pachet Python descris ca:
Recent am creat ton pentru vizualizarea Python execuție și importa profiluri; aceasta poate fi de ajutor aici.
Instala cu
pip3 instala ton
A crea un profil de execuțiepython-mcProfile -o program.prof yourfile.py
sau un profil de import (Python 3.7+ necesar)python-X importprofile yourfile.py 2> import.jurnal
Apoi executați doar ton pe fișierton program.prof
Nu's o mulțime de răspunsuri, dar ei fie utilizați linia de comandă sau un program extern pentru crearea de profiluri și/sau sortarea rezultatelor.
Am pierdut într-adevăr un fel am putea folosi în IDE (eclipse-PyDev), fără a atinge linia de comandă sau instalarea nimic. Deci, aici este.
Profilare fără linie de comandă
A se vedea documente sau alte răspunsuri pentru mai multe informații.
Următoarele Joe Shaw's a răspunde despre multi-threaded cod să nu lucreze cum era de așteptat, m-am gândit că runcall
metoda în cProfile este doar de a face de sine.enable () " și " auto.disable()
apeluri jurul profilate apel de funcție, astfel încât să puteți face pur și simplu tu însuți și să ai tot ce cod vrei în-între, cu interferență minimă cu cod existent.În Virtaal's sursa's un foarte util clasă și decorator care pot face profilare (chiar și pentru anumite metode/functii) foarte ușor. De ieșire poate fi apoi vizualizate foarte confortabil în KCacheGrind.
cProfile este mare pentru rapid profilare dar cele mai multe ori totul se termina cu erori. Funcția runctx rezolvă această problemă prin inițializarea corectă a mediului și a variabilelor, sper că poate fi util pentru cineva:
Calea mea este de a folosi yappi (https://code.google.com/p/yappi/). L's util mai ales combinat cu un RPC server unde (chiar și doar pentru depanare) tine registrul metodă pentru a porni, opri și de imprimare profilare informații, de exemplu, în acest fel:
Atunci când programul dvs. de lucru, puteți începe profiler în orice moment, prin apel la
startProfiler
RPC metodă și basculante profilare informații într-un fișier jurnal de asteptareprintProfiler
(sau modifica rpc metoda de a reveni la apelant) și a obține astfel de ieșire:Aceasta nu poate fi foarte util pentru script-uri scurte, dar ajută la optimizarea de tip server procesele având în vedere mai ales
printProfiler
metodă poate fi numit de mai multe ori de-a lungul timpului la profil și compara, de exemplu, programe diferite scenarii de utilizare.Dacă doriți pentru a face un cumulative profiler, sensul de a rula funcția de mai multe ori într-un rând și urmăriți suma rezultatelor.
puteți folosi acest
cumulative_profiler
decorator:l's python >= 3.6 specifice, dar puteți elimina `nelocale pentru a lucra la versiuni mai vechi.
Exemplu
profilare funcția "baz"
"baz" a fugit de 5 ori și tipărite asta:
specificarea sumei de ori
Pentru a adăuga la https://stackoverflow.com/a/582337/1070617,
Am scris acest modul care vă permite să utilizați cProfile și a vedea de ieșire cu ușurință. Mai multe aici: https://github.com/ymichael/cprofilev
Vezi, de asemenea: http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html privire la modul de a face sens din statisticile colectate.
Un nou instrument pentru a gestiona profiluri în Python este PyVmMonitor: http://www.pyvmmonitor.com/
Ea are unele caracteristici unice, cum ar fi
Notă:'s comercială, dar gratuit pentru open source.