Kaip galite apibūdinti „python“ scenarijų?

Projekto „Euler“ ir kiti kodavimo konkursai dažnai turi maksimalų laiko trukmę, arba žmonės giriasi, kaip greitai įvykdomas jų konkretus sprendimas. Kartais „python“ metodai yra šiek tiek kludgey - tai yra laiko kodo pridėjimas prie __main__ .

Kas yra geras būdas nustatyti, kiek laiko paleisti „python“ programą?

1031
24 февр. Chrisas Lawloras paprašė 24 vasario mėn. 2009-02-24 19:01 '09 19:01 2009-02-24 19:01
@ 23 atsakymai

„Python“ yra cProfile profileris. Jis rodo ne tik bendrą vykdymo laiką, bet ir atskirų funkcijų laiką ir nurodo, kiek kartų buvo iškviesta kiekviena funkcija, todėl lengva nustatyti, kur reikia atlikti optimizavimą.

Galite jį skambinti iš savo kodo arba iš vertėjo, pavyzdžiui:

 import cProfile cProfile.run('foo()') 

Naudingesnė yra tai, kad galite skambinti cProfile, kai vykdote scenarijų:

 python -m cProfile myscript.py 

Kad būtų dar lengviau, sukūriau nedidelį partijos failą, pavadintą „profile.bat“:

 python -m cProfile %1 

Taigi, viskas, ką reikia daryti, yra paleista:

 profile euler048.py 

Ir aš tai gaunu:

Python Profiling“ 
Taip pat per „YouTube“ .

1122
24 февр. Chris Lawlor atsakymas 24 vasaris 2009-02-24 19:01 '09 19:01 2009-02-24 19:01

Prieš kurį laiką aš padariau „ pycallgraph kuris sukuria vizualizaciją iš „Python“ kodo. Redaguoti: atnaujinau šį pavyzdį, kad galėčiau dirbti su naujausia versija.

pip install pycallgraph ir įdiegus „ GraphViz“, galite ją paleisti iš komandų eilutės:

 pycallgraph graphviz -- ./mypythonscript.py 

Arba galite įvesti tam tikras kodo dalis:

 from pycallgraph import PyCallGraph from pycallgraph.output import GraphvizOutput with PyCallGraph(output=GraphvizOutput()): code_to_profile() 

Bet kuris iš jų sukurs pycallgraph.png failą, panašų į paveikslėlį:

2019

354
06 авг. atsakymą pateikė Gerald Kaszuba 06 rugpjūtis 2012-08-06 08:37 '12 at 8:37 am 2012-08-06 08:37

Verta paminėti, kad profilio naudojimas (pagal nutylėjimą) pagrindiniame gijoje, ir jūs nesinaudosite kitomis temomis, jei jas naudosite. Tai gali būti šiek tiek gausa, nes ji nėra visiškai nurodyta profilio dokumentacijoje .

Jei taip pat norite susieti temas, reikia peržiūrėti dokumentuose esančią threading.setprofile() funkciją .

Taip pat galite sukurti savo threading.Thread

 class ProfiledThread(threading.Thread): # Overrides threading.Thread.run() def run(self): profiler = cProfile.Profile() try: return profiler.runcall(threading.Thread.run, self) finally: profiler.dump_stats('myprofile-%d.profile' % (self.ident,)) 

ir naudokite šią klasę ProfiledThread vietoj standartinio. Tai gali suteikti jums daugiau lankstumo, bet nesu įsitikinęs, kad tai verta, ypač jei naudojate trečiosios šalies kodą, kurio jūsų klasė nenaudos.

175
17 дек. Joe Shaw atsakymas 17 d. 2009-12-17 19:30 '09, 19:30 val. 2009-12-17 19:30

„Python wiki“ yra puikus puslapis, skirtas rinkti išteklius: http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code

kaip python dokumentai: http://docs.python.org/library/profile.html

Kaip rodo „Chris Lawlor“, „cProfile“ yra puiki priemonė ir gali būti lengvai naudojama ekrano spausdinimui:

 python -m cProfile -s time mine.py <args> 

arba failas:

 python -m cProfile -o output.file mine.py <args> 

PS> Jei naudojate Ubuntu, būtinai įdiekite python profilį

 sudo apt-get install python-profiler 

Jei išeisite iš failo, galite gauti gražių vaizdų naudodami šiuos įrankius.

PyCallGraph: įrankis skambučių grafikų vaizdams kurti
įdiegti:

  sudo pip install pycallgraph 

rida:

  pycallgraph mine.py args 

Peržiūrėti:

  gimp pycallgraph.png 

Galite naudoti viską, ką norite peržiūrėti png failą, naudoju gimp
Deja, dažnai būsiu

taškas: grafikas yra per didelis, kad būtų galima atlikti bitų žemėlapio atvaizdavimą. Taikyti iki 0.257079, kad atitiktų

todėl mano vaizdai yra neįprastai maži. Todėl paprastai sukuriu SVG failus:

 pycallgraph -f svg -o pycallgraph.svg mine.py <args> 

PS> būtinai įdiekite grafviz (kuri pateikia taškų programą):

 sudo pip install graphviz 

Alternatyvus kartografavimas naudojant gprof2dot per @ maxy / @ quodlibetor:

 sudo pip install gprof2dot python -m cProfile -o profile.pstats mine.py gprof2dot -f pstats profile.pstats | dot -Tsvg -o mine.svg 
127
08 окт. Atsakymas pateikiamas brent.payne 08 okt. 2011-10-08 03:04 '11 at 3:04 2011-10-08 03:04

@ Maxy komentaras dėl šio atsakymo man padėjo, kad manau, kad jis nusipelno asmeninio atsakymo: aš jau turėjau failus, kuriuos sukūrė cProfile.pstats, ir aš nenorėjau iš naujo paleisti dalykų naudojant „pycallgraph“, todėl naudoju gprof2dot ir gavau gražią svgs:

 $ sudo apt-get install graphviz $ git clone https://github.com/jrfonseca/gprof2dot $ ln -s "$PWD"/gprof2dot/gprof2dot.py ~/bin $ cd $PROJECT_DIR $ gprof2dot.py -f pstats profile.pstats | dot -Tsvg -o callgraph.svg 

ir BLAM!

Jis naudoja tašką (tas pats kaip ir „pycallgraph“ naudojimas), todėl išvestis atrodo tokia pati. Man atrodo, kad gprof2dot praranda mažiau informacijos, nors:

2019

117
12 дек. atsakymas pateikiamas 12 d. 2012-12-12 02:16 '12 at 2:16 2012-12-12 02:16

Tiriant šią temą, aš atėjau į patogų įrankį, vadinamą SnakeViz . SnakeViz yra internetinė vizualizavimo priemonė. Tai labai lengva įdiegti ir naudoti. Paprastai naudoju jį %prun failą su %prun ir statyti SnakeViz.

Pagrindinis naudojamas metodas yra „ Sunburst“ sklypas , kaip parodyta žemiau, kurioje funkcijų skambučių hierarchija yra organizuojama kaip lankų sluoksniai ir laiko informacija, užkoduota jų kampiniais plotiais.

Geriausia iš visų, ką galite bendrauti su diagrama. Pavyzdžiui, norėdami padidinti, galite spustelėti lanką, o lankas ir jo palikuonys bus priartinti kaip nauja saulės šviesa, kad būtų rodoma išsamesnė informacija.

2019

Taip pat verta paminėti GUI cProfile sąvartynų rodyklę RunSnakeRun . Tai leidžia jums rūšiuoti ir pasirinkti, taip padidinant atitinkamų programos dalių skalę. Vaizdo stačiakampių dydis yra proporcingas laikui. Jei perkeliate pelę virš stačiakampio, pasirinkite šį skambutį lentelėje ir visur žemėlapyje. Dukart spustelėjus stačiakampį, ši dalis bus pakeista. Jis parodys jums, kas įvardija šią dalį ir kas sukelia šią dalį.

Aprašoma informacija yra labai naudinga. Jis parodo kodo kodą, kuris gali būti naudingas, kai kalbate apie įterptųjų bibliotekų skambučius. Jis nurodo, kurį failą ir kokią eilutę rasti kodą.

Taip pat noriu atkreipti dėmesį į tai, kad OP sakė „profiliavimą“, tačiau atrodo, kad jis reiškė „laiką“. Turėkite omenyje, kad profiliai bus vykdomi lėčiau.

2019

33
22 февр. Atsakymą Pete pateikė vasario 22 d. 2015-02-22 19:18 '15, 19:18, 2015-02-22 19:18

Manau, kad cProfile puikiai tinka profiliavimui, o kcachegrind puikiai tinka rezultatams vizualizuoti. pyprof2calltree yra tarp failų apdorojimo.

 python -m cProfile -o script.profile script.py pyprof2calltree -i script.profile -o script.calltree kcachegrind script.calltree 

Norėdami įdiegti būtinus įrankius (bent jau Ubuntu):

 apt-get install kcachegrind pip install pyprof2calltree 

Rezultatas:

2019

11 мая '16 в 11:32 2016-05-11 11:32 atsakymą Federico pateikė gegužės 16 d. 16 val. 11:32 2016-05-11 11:32

pprofilis

line_profiler (jau pateiktas čia) taip pat įkvėpė „ pprofile , kuris apibūdinamas kaip:

Linijinis granuliarumas, deterministinis ir statistinis neto python profileris

Ji suteikia linijinį detalizavimą, pavyzdžiui, line_profiler , yra grynas Python, gali būti naudojamas kaip atskira komanda arba modulis, ir netgi gali sukurti „callgrind“ failus, kuriuos galima lengvai analizuoti naudojant [k|q]cachegrind .

vprof

Taip pat yra vprof , Python paketas, aprašytas kaip:

[...] teikia daugybę ir interaktyvių vaizdų įvairioms „Python“ programos funkcijoms, pvz., veikimo trukmei ir atminties naudojimui.

2019

Geras kartografavimo modulis yra line_profiler (vadinamas naudojant scenarijų kernprof.py). Ją galima atsisiųsti čia .

Suprantu, kad „cProfile“ pateikia informaciją apie visą laiką, praleistą kiekvienai funkcijai. Taigi, atskiros kodo eilutės nėra sinchronizuojamos. Tai yra mokslinių skaičiavimų problema, nes dažnai viena eilutė gali užtrukti daug laiko. Taip pat, kaip prisimenu, „cProfile“ nesulaikė laiko, kurį praleidau naudojant „numpy.dot“.

28

Kai Joe Shaw atsako, kad daugiapakopis kodas neveikia tinkamai, supratau, kad „ runcall metodas „runcall“ tiesiog atlieka „ self.enable() ir „ self.disable() skambučius aplink profilio funkciją, todėl galite tiesiog padaryti jį jūs patys turite bet kokį kodą, kurį norite tarp minimalaus trukdymo esamam kodui.

11
09 нояб. atsakymą pateikė PypeBros 09 lapkričio. 2011-11-09 15:59 '11, 15:59, 2011-11-09 15:59

Virtaal šaltinis yra labai naudinga klasė ir dekoratorius, kuris gali padaryti profiliavimą (net ir tam tikriems metodams / funkcijoms) labai paprasta. Rezultatas gali būti patogiai peržiūrėtas KCacheGrind.

10
24 февр. Atsakymą pateikė Walter , vasario 24 d. 2009-02-24 23:31 '09 23:31 2009-02-24 23:31

Yra daug puikių atsakymų, bet jie naudoja komandinę eilutę arba išorinę programą, kad apibūdintų ir (arba) surūšiuotų rezultatus.

Aš tikrai praleidau tam tikrą metodą, kurį galėčiau naudoti savo IDE (eclipse-PyDev), neliesdamas komandinės eilutės arba nieko neįdiegus. Taigi, čia.

Profiliavimas be komandinės eilutės

 def count(): from math import sqrt for x in range(10**5): sqrt(x) if __name__ == '__main__': import cProfile, pstats cProfile.run("count()", "{}.profile".format(__file__)) s = pstats.Stats("{}.profile".format(__file__)) s.strip_dirs() s.sort_stats("time").print_stats(10) 

Daugiau informacijos rasite dokumentuose ar kituose atsakymuose.

10
21 авг. David Mašek atsakymas rugpjūčio 21 d 2015-08-21 14:59 '15, 14:59 pm 2015-08-21 14:59

cProfilis puikiai tinka sparčiam profiliavimui, bet didžiąją laiko dalį jis baigė klaidas man. Runctx funkcija išsprendžia šią problemą teisingai inicijuodama aplinką ir kintamuosius, tikėdamasi, kad tai gali būti naudinga:

 import cProfile cProfile.runctx('foo()', None, locals()) 
9
30 марта '15 в 14:11 2015-03-30 14:11 atsakymas pateikiamas Datageek kovo 30 d. 15, 14:11 2015-03-30 14:11

Mano būdas yra naudoti „yappi“ ( https://code.google.com/p/yappi/ ). Tai ypač naudinga kartu su RPC serveriu, kur (netgi derinant) registruojate profilio informacijos pradžios, sustabdymo ir spausdinimo metodą. tokiu būdu:

 @staticmethod def startProfiler(): yappi.start() @staticmethod def stopProfiler(): yappi.stop() @staticmethod def printProfiler(): stats = yappi.get_stats(yappi.SORTTYPE_TTOT, yappi.SORTORDER_DESC, 20) statPrint = '\n' namesArr = [len(str(stat[0])) for stat in stats.func_stats] log.debug("namesArr %s", str(namesArr)) maxNameLen = max(namesArr) log.debug("maxNameLen: %s", maxNameLen) for stat in stats.func_stats: nameAppendSpaces = [' ' for i in range(maxNameLen - len(stat[0]))] log.debug('nameAppendSpaces: %s', nameAppendSpaces) blankSpace = '' for space in nameAppendSpaces: blankSpace += space log.debug("adding spaces: %s", len(nameAppendSpaces)) statPrint = statPrint + str(stat[0]) + blankSpace + " " + str(stat[1]).ljust(8) + "\t" + str( round(stat[2], 2)).ljust(8 - len(str(stat[2]))) + "\t" + str(round(stat[3], 2)) + "\n" log.log(1000, "\nname" + ''.ljust(maxNameLen - 4) + " ncall \tttot \ttsub") log.log(1000, statPrint) 

Tada, kai jūsų programa veikia, startProfiler galite paleisti bet kuriuo metu, paskambinę startProfiler RPC metodu ir startProfiler profilio duomenis į žurnalo failą, paskambinę printProfiler (arba pakeiskite RPC metodą, kad grąžintumėte jį skambintojui) ir gaukite šią išvestį:

 2014-02-19 16:32:24,128-|SVR-MAIN |-(Thread-3 )-Level 1000: name ncall ttot tsub 2014-02-19 16:32:24,128-|SVR-MAIN |-(Thread-3 )-Level 1000: C:\Python27\lib\sched.py.run:80 22 0.11 0.05 M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\xmlRpc.py.iterFnc:293 22 0.11 0.0 M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\serverMain.py.makeIteration:515 22 0.11 0.0 M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\PicklingXMLRPC.py._dispatch:66 1 0.0 0.0 C:\Python27\lib\BaseHTTPServer.py.date_time_string:464 1 0.0 0.0 c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py._get_raw_meminfo:243 4 0.0 0.0 C:\Python27\lib\SimpleXMLRPCServer.py.decode_request_content:537 1 0.0 0.0 c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py.get_system_cpu_times:148 4 0.0 0.0 <string>.__new__:8 220 0.0 0.0 C:\Python27\lib\socket.py.close:276 4 0.0 0.0 C:\Python27\lib\threading.py.__init__:558 1 0.0 0.0 <string>.__new__:8 4 0.0 0.0 C:\Python27\lib\threading.py.notify:372 1 0.0 0.0 C:\Python27\lib\rfc822.py.getheader:285 4 0.0 0.0 C:\Python27\lib\BaseHTTPServer.py.handle_one_request:301 1 0.0 0.0 C:\Python27\lib\xmlrpclib.py.end:816 3 0.0 0.0 C:\Python27\lib\SimpleXMLRPCServer.py.do_POST:467 1 0.0 0.0 C:\Python27\lib\SimpleXMLRPCServer.py.is_rpc_path_valid:460 1 0.0 0.0 C:\Python27\lib\SocketServer.py.close_request:475 1 0.0 0.0 c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\__init__.py.cpu_times:1066 4 0.0 0.0 

Tai gali būti nelabai naudinga trumpiems scenarijus, tačiau ji padeda optimizuoti procesus, pavyzdžiui, serverį, ypač atsižvelgiant į tai, kad printProfiler metodas gali būti pakartotinai vadinamas profiliu ir, pavyzdžiui, lyginamas. skirtingus programos naudojimo scenarijus.

6
atsakymas pateikiamas p. 19 февр. Girgitt 19 Vas 2014-02-19 18:38 '14 at 18:38 2014-02-19 18:38

Neseniai sukūriau tuną, skirtą vizualizuoti „Python“ vykdymo ir importo profiliuose; Čia gali būti naudinga.

2019

04 авг. Nico Schlömer atsakymas 04 rug . 2018-08-04 10:27 '18, 10:27 2018-08-04 10:27

Tai priklausys nuo to, ką norite matyti iš profiliavimo. Galima nustatyti paprastas laiko metrikas (bash).

 time python python_prog.py 

Net „/ usr / bin / time“ gali rodyti išsamias metrikas, naudodami „--verbose“ vėliavą.

Norėdami patikrinti kiekvienos funkcijos nustatytą laiko metriką ir geriau suprasti, kiek laiko praleidžiama funkcijoms, galite naudoti integruotą cProfile pythone.

Kalbant apie išsamesnius rodiklius, tokius kaip našumas, laikas nėra vienintelis rodiklis. Galite nerimauti dėl atminties, gijų ir pan.
Profiliavimo parinktys:
1. line_profiler yra dar vienas profileris, paprastai naudojamas laiko rodikliams nustatyti.
2. memory_profiler - įrankis, skirtas atminties naudojimui profilyje.
3. Heapy (iš „Guppy“ projekto) Profilis apie krūvos objektų naudojimą.

Štai keletas dažniausiai naudojamų. Bet jei norite sužinoti daugiau, pabandykite skaityti šią knygą, tai yra gana gera knyga apie tai, kaip pradėti darbą. Naudodami „Cython“ ir „JIT“ („Just-in-time“) „Python“ kompiliacijas galite atnaujinti į pažangias temas.

3
19 апр. atsakymą pateikė VishalMishra 19 balandis. 2017-04-19 22:42 '17, 10:42 pm 2017-04-19 22:42

Nauja „Python“ profilio apdorojimo priemonė yra „PyVmMonitor“: http://www.pyvmmonitor.com/

Ji turi keletą unikalių savybių, pvz

  • Pritvirtinkite profilį prie veikiančios (CPython) programos
  • Parinkimas pagal užsakymą su Yappi integracija
  • Profilis kitoje mašinoje
  • Kelių procesų palaikymas (multiprocessing, django ...)
  • Tiesioginis mėginių ėmimo / peržiūros procesorius (su pasirinktu laiko intervalu)
  • Deterministinis profiliavimas naudojant cProfile / profile integraciją
  • Esamų PSt rezultatų analizė
  • Atidarykite DOT failus
  • Prieiga prie programinės įrangos API.
  • Grupuokite mėginius pagal metodą arba eilutę
  • PyDev integracija
  • „PyCharm“ integracija

Pastaba: jis yra komercinis, bet atviro kodo atveju - nemokamas.

3
29 апр. atsakymą pateikė Fabio Zadrozny balandžio 29 d. 2015-04-29 01:50 '15 - 1:50 2015-04-29 01:50

Jei norite pridėti prie ngn-wiki.ru.site/questions/11372 / ... ,

Aš parašiau šį modulį, kuris leidžia jums lengvai naudoti cProfile ir lengvai peržiūrėti jo produkciją. Skaitykite daugiau čia: https://github.com/ymichael/cprofilev

 $ python -m cprofilev /your/python/program # Go to http://localhost:4000 to view collected statistics. 

Taip pat žiūrėkite: http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html apie tai, kaip suprasti surinktą statistiką.

3
21 марта '15 в 16:50 2015-03-21 16:50 Michelio atsakymas kovo 21 d. 15, 16:50 2015-03-21 16:50

Visada norite žinoti, kas yra pragaras, ką daro python scenarijus? Tipas Patikrinkite apvalkalą. „Inspect Shell“ leidžia spausdinti / keisti pasaulines vertes ir paleisti funkcijas be scenarijų pertraukos. Dabar su automatinio užbaigimo ir komandų istorija (tik „Linux“).

„Inspect Shell“ nėra „pdb“ tipo debugger.

https://github.com/amoffat/Inspect-Shell

Jūs galite jį naudoti (ir rankinį laikrodį).

3
13 окт. pulkininko Paniko atsakymas spalio 13 d. 2012-10-13 18:21 '12 at 18:21 pm 2012-10-13 18:21

Taip pat yra statistinis profileris, vadinamas statprof . Tai yra profilio mėginys, todėl jis priduria minimalų pridėtinę vertę prie jūsų kodo ir suteikia linijinius (ir ne tik funkcinius) laiko nustatymus. Jis labiau tinka minkštoms realiu laiku naudojamoms programoms, pvz., Žaidimams, bet gali būti mažesnis nei cProfile tikslumas.

Pypi “ versija yra šiek tiek pasenusi, todėl jūs galite ją įdiegti su „ pip , nurodydami „git“ saugyklą :

 pip install git+git://github.com/bos/statprof.py@1a33eba91899afe17a8b752c6dfdec6f05dd0c01 

Galite paleisti jį taip:

 import statprof with statprof.profile(): my_questionable_function() 

Taip pat žiūrėkite ngn-wiki.ru.site/questions/11395 / ...

1
12 февр. atsakymas pateikiamas z0r 12 vasario mėn 2016-02-12 01:50 '16 at 1:50 2016-02-12 01:50

Kai nesu serverio, naudoju „ lsprofcalltree.py“ ir paleiskite šią programą taip:

 python lsprofcalltree.py -o callgrind.1 test.py 

Tada galiu atidaryti ataskaitą su bet kuria programine įranga, suderinama su callgrind, pvz., Qcachegrind

0
02 февр. Atsakymą pateikė Vincent Fenet 02 vasaris. 2017-02-02 13:18 '17, 13:18 pm 2017-02-02 13:18