Como medir a sua             aplicaçãoIntrodução à conceitos de profiling, debug e tracing        Mauro Baraldi - Python B...
Quem sou eu?
http://www.66batman.com/cgi-bin/yabb2/YaBB.pl?num=1296085129
Mauro Navarro BaraldiProgramando em Python desde 2001         DesenvolvedorMais
Pai da Maria Eduarda, do João Fernando e marido da Camila
Tópicos- Conceitos- Por que monitorar uma aplicação- Debugging- Profiling- Tracing- Memory Profiling- Holly Grail- Dúvidas?
Conceitos- Debug: Metodo de Investigação do sistema(em execução) em busca do problema/erro.- Profiling: Análise dinâmica d...
Porque monitorar uma aplicação- Aprendizado- Bugs- Segurança- Desempenho
Premature optimization is the root of all evil.                                                                          T...
Debugging http://static.ddmcdn.com/gif/myths-everyday-science-1.jpg
pdbBiblioteca da padrão para debugging de códigoPrós:- fácil- simples- nativaContras:- IMHO nenhum!
debug_app.py#!/usr/bin/env pythonfrom pdb import set_tracedef debug_me(value):    set_trace() # Aqui ativa-se o debug    i...
resultado do pdbmauro@r2d2:~/projetos/pythonbrasil8$ python pdb_app.py> /home/mauro/projetos/pythonbrasil8/pdb_app.py(9)de...
Profilinghttp://www.guardian.co.uk/books/booksblog/2012/oct/30/scary-stories-halloween-francis-marion-crawford
Standard Library    http://aidsource.ning.com/page/resource-library
cProfileBiblioteca padrão para profilingPrós:- standard lib- baixo impacto na execução.- usa extensão em CContras:- só fun...
profile_app.py#!/usr/bin/env pythondef profile_me(limit):   counter = 0    while counter <= limit:        counter = counte...
resultado do profilemauro@r2d2:~/projetos/pythonbrasil8$ python -m cProfile profile_app.py     1 function calls in 0.000 s...
resultado do profile - legendancalls: numero de chamadostottime: tempo total gasto na função dada (excluindo o tempo feito...
profileOutra biblioteca inspirada na cProfile (Pure Python)  Prós:  - standard lib  Contras:  - os mesmo da cProfile  - im...
hotshotBiblioteca para profiling em alto desempenhoPrós:- standard lib- baixo impacto na execução, cProfile.Contras:- mais...
Bibliotecas e Aplicações  Externas
line_profilerProfiling linha a linhaPrós:- simples e fácil- usa a cProfile- visão detalhada da execução do código.Contras:...
resultado do line_profilermauro@r2d2:~/projetos/pythonbrasil8$ kernprof.py -l line_profile_app.pyWrote profile results to ...
Análisehttp://blog.hubspot.com/blog/tabid/6307/bid/31619/How-to-Conduct-Competitive-Analysis-to-Step-Up-Your-Content-Strat...
RunSnakeRunAnalise de dados gerados a partir do profiler.                    http://mg.pov.lt/run-snake-run.png
runsnakerun_app.py #!/usr/bin/env python def print_function(data):     print data def char2ord(char):     return ord(char)...
visualização da análise
Tracinghttp://cavemanreflections.blogspot.com.br/p/follow-yellow-brick-road.html
traceBiblioteca da padrão para tracing de códigoPrós:- fácil- simples- nativaContras:- IMHO nenhum!
trace_app.py#!/usr/bin/env pythondef trace_me(value):    if value >   0:        return   positivo    elif value   < 0:    ...
resultado do line_profiler$ python -m trace --trace trace_app.py --- modulename: trace_app, funcname: <module>trace_app.py...
disptraceTracing de código exportando a saida para HTMLPrós:- exporta em um formato visualContras:- roda dentro de um cont...
disptrace_app.pyimport disptracedef browse_disptrace(dt):    import tempfile, webbrowser, urllib, os   html = dt.render() ...
visualização da análise
Memory Profiling  http://spectrum.ieee.org/semiconductors/memory/the-quest-for-a-universal-memory
memory profilerProfiling de memoriaPrós:- facil- simples- integração com pdbContras:- Não encontrei
memory_profiler_app.py@profiledef potencia(expoente):    for i in range(expoente):         print 2^%i = %i % (i, pow(2,i))...
resultado do memory_profiler$ python -m memory_profiler memory_profile_app.pyFilename: memory_profile_app.pyLine # Mem usa...
All togetherhttp://janeaustenfilmclub.blogspot.com.br/2011/06/monty-python-and-holy-grail.html
Holly Grailhttp://www.shopping.com/Toy-Vault-Monty-Python-s-Holy-Grail-Plush/info
psutilsbiblioteca de monitoramento de recursos do sistemaPrós:- multi-plataforma- fácil- resultados em estruturas de dados...
ReferenciasMódulos e aplicaçõespdb: http://docs.python.org/2/library/pdb.htmlcProfile: http://docs.python.org/2/library/pr...
Dúvidas?http://fogsmoviereviews.com/2012/06/24/movies-that-everyone-should-see-monty-python-and-the-holy-grail/
Source Codehttps://github.com/maurobaraldi/pybr8
Thank Youhttp://spectrumculture.com/2010/01/film-dunce-monty-python-and-the-holy-grail.html/
Upcoming SlideShare
Loading in …5
×

Pythonbrasil8

708 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
708
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Pythonbrasil8

  1. 1. Como medir a sua aplicaçãoIntrodução à conceitos de profiling, debug e tracing Mauro Baraldi - Python Brasil 2012
  2. 2. Quem sou eu?
  3. 3. http://www.66batman.com/cgi-bin/yabb2/YaBB.pl?num=1296085129
  4. 4. Mauro Navarro BaraldiProgramando em Python desde 2001 DesenvolvedorMais
  5. 5. Pai da Maria Eduarda, do João Fernando e marido da Camila
  6. 6. Tópicos- Conceitos- Por que monitorar uma aplicação- Debugging- Profiling- Tracing- Memory Profiling- Holly Grail- Dúvidas?
  7. 7. Conceitos- Debug: Metodo de Investigação do sistema(em execução) em busca do problema/erro.- Profiling: Análise dinâmica de um sistemapara medir recursos usado por ele no sistema.- Tracing: Processo de gravar ocomportamento de runtime do sistema paraanálise (debug/profiling)
  8. 8. Porque monitorar uma aplicação- Aprendizado- Bugs- Segurança- Desempenho
  9. 9. Premature optimization is the root of all evil. Tony Hoare http://www.turing100.manchester.ac.uk/index.php/speakers/invited-list/11-speakers/39
  10. 10. Debugging http://static.ddmcdn.com/gif/myths-everyday-science-1.jpg
  11. 11. pdbBiblioteca da padrão para debugging de códigoPrós:- fácil- simples- nativaContras:- IMHO nenhum!
  12. 12. debug_app.py#!/usr/bin/env pythonfrom pdb import set_tracedef debug_me(value): set_trace() # Aqui ativa-se o debug if value > 0: print positivo elif value < 0: print negativo else: print zeroif __name__ == __main__: debug_me(0)
  13. 13. resultado do pdbmauro@r2d2:~/projetos/pythonbrasil8$ python pdb_app.py> /home/mauro/projetos/pythonbrasil8/pdb_app.py(9)debug_me()-> if value > 0:(Pdb) n> /home/mauro/projetos/pythonbrasil8/pdb_app.py(11)debug_me()-> elif value < 0:(Pdb) n> /home/mauro/projetos/pythonbrasil8/pdb_app.py(14)debug_me()-> return zero(Pdb) n--Return--> /home/mauro/projetos/pythonbrasil8/pdb_app.py(14)debug_me()->zero-> return zero(Pdb) n--Return--> /home/mauro/projetos/pythonbrasil8/pdb_app.py(17)<module>()->None-> debug_me(0)(Pdb) n
  14. 14. Profilinghttp://www.guardian.co.uk/books/booksblog/2012/oct/30/scary-stories-halloween-francis-marion-crawford
  15. 15. Standard Library http://aidsource.ning.com/page/resource-library
  16. 16. cProfileBiblioteca padrão para profilingPrós:- standard lib- baixo impacto na execução.- usa extensão em CContras:- só funciona com metodos- não há suporte para gráficos (nativo)
  17. 17. profile_app.py#!/usr/bin/env pythondef profile_me(limit): counter = 0 while counter <= limit: counter = counter + 1if __name__ == __main__: profile_me(10)
  18. 18. resultado do profilemauro@r2d2:~/projetos/pythonbrasil8$ python -m cProfile profile_app.py 1 function calls in 0.000 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 {method disable of _lsprof.Profiler objects} 8 function calls in 0.001 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.001 0.001 cProfile.py:132(run) 1 0.000 0.000 0.001 0.001 cProfile.py:137(runctx) 1 0.000 0.000 0.001 0.001 cProfile.py:14(run) 1 0.000 0.000 0.000 0.000 cProfile.py:5(<module>) 1 0.000 0.000 0.000 0.000 cProfile.py:66(Profile) 1 0.000 0.000 0.001 0.001 profile_app.py:3(<module>) 1 0.000 0.000 0.000 0.000 profile_app.py:5(profile_me) 1 0.001 0.001 0.001 0.001 {method enable of _lsprof.Profiler objects
  19. 19. resultado do profile - legendancalls: numero de chamadostottime: tempo total gasto na função dada (excluindo o tempo feito naschamadas para sub-funções)percall: tottime/ncallscumtime: tempo total gasto nesta e todas as subrotinaspercall: cumtime/ncallsfilename:lineno(function): dados respectivos de cada função
  20. 20. profileOutra biblioteca inspirada na cProfile (Pure Python) Prós: - standard lib Contras: - os mesmo da cProfile - impacto significante na execução. Usada para extender as funcionalidades do profiler default (cProfile).
  21. 21. hotshotBiblioteca para profiling em alto desempenhoPrós:- standard lib- baixo impacto na execução, cProfile.Contras:- mais lento na geração dos dados- não funciona bem com threads- será descontinuado em breve.
  22. 22. Bibliotecas e Aplicações Externas
  23. 23. line_profilerProfiling linha a linhaPrós:- simples e fácil- usa a cProfile- visão detalhada da execução do código.Contras:- desempenho inferior ao cProfile- resultado resumido
  24. 24. resultado do line_profilermauro@r2d2:~/projetos/pythonbrasil8$ kernprof.py -l line_profile_app.pyWrote profile results to line_profile_app.py.lprofmauro@r2d2:~/projetos/pythonbrasil8$ python -m line_profiler line_profile_app.py.lprofTimer unit: 1e-06 sFile: line_profile_app.pyFunction: profile_me at line 3Total time: 1e-05 sLine # Hits Time Per Hit % Time Line Contents============================================================== 3 @profile 4 def profile_me(limit): 5 6 1 1 1.0 10.0 counter = 0 7 8 12 5 0.4 50.0 while counter <= limit: 9 11 4 0.4 40.0 counter = counter + 1
  25. 25. Análisehttp://blog.hubspot.com/blog/tabid/6307/bid/31619/How-to-Conduct-Competitive-Analysis-to-Step-Up-Your-Content-Strategy.aspx
  26. 26. RunSnakeRunAnalise de dados gerados a partir do profiler. http://mg.pov.lt/run-snake-run.png
  27. 27. runsnakerun_app.py #!/usr/bin/env python def print_function(data): print data def char2ord(char): return ord(char) def profile_me(word): for char in word: num = char2ord(char) print_function(Ordinal from %s is %i % (char, num)) if __name__ == __main__: profile_me("Python Brasil 8")gerando os dados de análise$ python -m cProfile -o snake.data runsnakerun_app.py
  28. 28. visualização da análise
  29. 29. Tracinghttp://cavemanreflections.blogspot.com.br/p/follow-yellow-brick-road.html
  30. 30. traceBiblioteca da padrão para tracing de códigoPrós:- fácil- simples- nativaContras:- IMHO nenhum!
  31. 31. trace_app.py#!/usr/bin/env pythondef trace_me(value): if value > 0: return positivo elif value < 0: return negativo else: return zeroif __name__ == __main__: trace_me(0)
  32. 32. resultado do line_profiler$ python -m trace --trace trace_app.py --- modulename: trace_app, funcname: <module>trace_app.py(3): def trace_me(value):trace_app.py(12): if __name__ == __main__:trace_app.py(13): trace_me(0) --- modulename: trace_app, funcname: trace_metrace_app.py(5): if value > 0:trace_app.py(7): elif value < 0:trace_app.py(10): return zero --- modulename: trace, funcname: _unsettracetrace.py(80): sys.settrace(None)
  33. 33. disptraceTracing de código exportando a saida para HTMLPrós:- exporta em um formato visualContras:- roda dentro de um contexto da app
  34. 34. disptrace_app.pyimport disptracedef browse_disptrace(dt): import tempfile, webbrowser, urllib, os html = dt.render() tempfiledes, temppath = tempfile.mkstemp(suffix=.html) tempfile = os.fdopen(tempfiledes, "w") tempfile.write(html) tempfile.close() tempurl = "file://{}".format(urllib.pathname2url(temppath)) webbrowser.get(None).open_new(tempurl)def if_test(a, b, c): if a > 10: print "this" elif b > 10: print "that" else: print "result is", b*ct = disptrace.DispTrace()t.runfunc(if_test, 1, 2, 3)browse_disptrace(t)
  35. 35. visualização da análise
  36. 36. Memory Profiling http://spectrum.ieee.org/semiconductors/memory/the-quest-for-a-universal-memory
  37. 37. memory profilerProfiling de memoriaPrós:- facil- simples- integração com pdbContras:- Não encontrei
  38. 38. memory_profiler_app.py@profiledef potencia(expoente): for i in range(expoente): print 2^%i = %i % (i, pow(2,i))if __name__ == __main__: potencia(10)
  39. 39. resultado do memory_profiler$ python -m memory_profiler memory_profile_app.pyFilename: memory_profile_app.pyLine # Mem usage Increment Line Contents================================================ 3 @profile 4 9.00 MB 0.00 MB def potencia(expoente): 5 9.00 MB 0.00 MB for i in range(expoente): 6 print 2^%i = %i % (i, pow(2,i))
  40. 40. All togetherhttp://janeaustenfilmclub.blogspot.com.br/2011/06/monty-python-and-holy-grail.html
  41. 41. Holly Grailhttp://www.shopping.com/Toy-Vault-Monty-Python-s-Holy-Grail-Plush/info
  42. 42. psutilsbiblioteca de monitoramento de recursos do sistemaPrós:- multi-plataforma- fácil- resultados em estruturas de dados Python- monitora: - cpu/processos - memoria/discos, - rede - usuarios
  43. 43. ReferenciasMódulos e aplicaçõespdb: http://docs.python.org/2/library/pdb.htmlcProfile: http://docs.python.org/2/library/profile.htmlline_profiler: http://packages.python.org/line_profiler/RunSnakeRun: http://www.vrplumber.com/programming/runsnakerun/trace: http://docs.python.org/2/library/trace.htmldisp_trace: https://github.com/atsuoishimoto/disptracememory_profiler: https://github.com/fabianp/memory_profilerpsutil: http://code.google.com/p/psutil/MaisCode Profiling: http://en.wikipedia.org/wiki/Code_profilingPython Profiling: http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_CodeProfile Hooks (decorators for Python profiling): http://mg.pov.lt/profilehooks/
  44. 44. Dúvidas?http://fogsmoviereviews.com/2012/06/24/movies-that-everyone-should-see-monty-python-and-the-holy-grail/
  45. 45. Source Codehttps://github.com/maurobaraldi/pybr8
  46. 46. Thank Youhttp://spectrumculture.com/2010/01/film-dunce-monty-python-and-the-holy-grail.html/

×