Bogosort e Técnicas Realmente Avançadas de Programação

1,050 views

Published on

Palestra apresentada no FISL 12.

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,050
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Bogosort e Técnicas Realmente Avançadas de Programação

  1. 1. BS&TRAP #bstrap Ikke Pereira Rodolpho Eck
  2. 2. NinjaSort
  3. 3. MonkeySort
  4. 4. EstouComSort
  5. 5. Fluxograma
  6. 6. Comentários
  7. 7. Seja descritivo#!/usr/bin/env python# -*- coding: utf-8 -*-## Autor: Rodolpho Eckhardt <me@rodolphoeck.com># Data: 29/06/2011"""BogoSorter Meta Super Class Super meta classe da qual todas as demais nesse projeto herdam. Não ouse inserir uma classe nesse projeto que não herde dessa aqui. Infratores serão detectados, mortos e listados aqui para humilhação pública: Michael Jackson Érico Andrei Guido Van Rossum
  8. 8. Nome de Variáveis?
  9. 9. Seja descritivo também!strNomeintIdadeblnLogadodctValores
  10. 10. Mas não f*&&*!!strNumeroDoPedidovarValorblnPago = ‘S’objConjuntoDosValoresCujosNomesNaoCabe
  11. 11. Bound methods
  12. 12. O que acontece? • Bound methods são callables locais:>>> s = []>>> s_append = s.append>>> s_append(1)>>> s_append(2)>>> s_append(3)>>> s[1, 2, 3]
  13. 13. Por que??• Substitua lookups globais com lookups locais!!
  14. 14. Exemplo (não otimizado)def one_third(x): return x / 3.0def make_table(pairs): result = [] for value in pairs: x = one_third(value) result.append( format(value, 9.5f’)) return n.join(result)
  15. 15. Exemplo (otimizado)def make_table(pairs): result = [] # bound method result_append = result.append # localized _format = format for value in pairs: # in-lined x = value / 3.0 result_append(_format(value, 9.5f)) return n.join(result)
  16. 16. Inferno de uma letra
  17. 17. import os,sysC=os.chdirS=os.systemM=os.mkdirJ=os.path.joinA=os.path.abspathD=os.path.dirnameE=os.path.existsW=sys.stdout.writeV=sys.argvX=sys.exitERR=lambda m:W(m+"n")PRNT=lambda m:W(m+"n") assert len(V)==2,"you must provide asandbox name"SB=V[1]H=A(D(__file__))SBD=J(D(H),SB)C(SBD)PST=J(SBD,bin/paster)VAR=J(SBD,var)ETC=J(SBD,etc)S("mkdir -p "+VAR)PRNT("restarting "+SB)CMD=";".join([source %s%J(SBD,bin/activate),PST+" serve--daemon --pid- file=%s/sandbox.pid --log-file=%s/sandbox.log %s/sandbox.ini start"% (VAR,VAR,ETC)])PRNT(CMD)
  18. 18. Vetorização
  19. 19. Por que??Substitua um loop “for” com uma chamada de função C!
  20. 20. Exemplos!![[ord ord(c) for c in long_string]] list(map(ord, long_string))
  21. 21. Exemplos!! [i**2 for i in range(100)]list(map(pow, count(0), repeat(2, 100))
  22. 22. Lambda infection!
  23. 23. Mmm...lstRollOut = lstRollOut + filter(lambda x: x[-1]== 0, filter(lambda x: x != 0|0,lstMbrSrcCombo))if not filter(lambda lst, sm=sm: sm in lst, map(lambda x, dicA=dicA: dicA.get(x, []),lstAttribute)):
  24. 24. FFFFUUUUU......_make_keys = lambda cc, pm: tuple(map (lambda m,c=cc: ("%s.%s" % (c, m), m), pm))return [map(lambda l: l[0], lstResults),map(lambdal: l[1], lstResults)]sum = lambda lst: lst and reduce(lambda x, y: x +y, lst) or 0assert reduce(lambda x,y: x or y, [z.id ==event.id for z in events])
  25. 25. kwargs mutáveis
  26. 26. Why brother?def nao_faz_o_que_vc_acha(item, lista=[]): ... lista.append(item) ... return lista
  27. 27. Why brother?>>> print nao_faz_o_que_vc_acha(1)[1]>>> print nao_faz_o_que_vc_acha(2)[1, 2]>>> print nao_faz_o_que_vc_acha(3)[1, 2, 3]>>> print nao_faz_o_que_vc_acha(4)[1, 2, 3, 4]>>> print nao_faz_o_que_vc_acha(wtf)[1, 2, 3, 4, wtf]
  28. 28. Mas tio....def aprendi_tio(item, lista=None): l = lista or [] ... l.append(item) ... return l
  29. 29. LRU Cache
  30. 30. Fibonacci•fibonacci(n): •n <= 1: n •n > 1: fibonacci(n-1) + fibonacci(n-2)
  31. 31. n00bdef fibonacci(n): if n <= 1: return n return (fibonacci(n-1) + fibonacci(n-2))
  32. 32. LRU Cacheimport functools@functools.lru_cache()def fibonacci(n): if n <= 1: return n return (fibonacci(n-1) + fibonacci(n-2))
  33. 33. Código bonito de se ver
  34. 34. from regrets import unfortunate_choicesclass AnotherBadHabit(object): short_name = foo much_longer_name = bar def __init__(self, x, y, z): self.x = x self.y = y self.dictionary = { ‘foo‘ : ‘bar’, ‘bar‘ : ‘baz’, ‘baz‘ : ‘quux’}
  35. 35. from regrets import unfortunate_choicesclass AnotherBadHabit(object): short_name = foo much_longer_name = bar def __init__(self, x, y, z): self.x = x self.y = y self.z_is_a_silly_name = z self.came_later = 42 self.leftover = ‘timewaster’ self.dictionary = { ‘foo‘ : ‘bar’, ‘bar‘ : ‘baz’, ‘baz‘ : ‘quux’}
  36. 36. from regrets import unfo...class AnotherBadHabit(object): short_name = foo much_longer_name = bar def __init__(self, x, y, z): self.x = x self.y = y self.z_is_a_silly_name = z self.came_later = 42 self.leftover = ‘timewaster’ self.dictionary = { ‘foo‘ : ‘bar’, ‘bar‘ : ‘baz’, ‘baz‘ : ‘quux’}
  37. 37. Metodologia
  38. 38. eXtreme Go Horse (extreme)http://gohorseprocess.wordpress.com/
  39. 39. Pensou, não é XGHx.
  40. 40. Não existe refactoring. Apenas rework.
  41. 41. Se tiver funcionando, não rela a mão.
  42. 42. Testes são pros fracos.
  43. 43. Fear Driven Development
  44. 44. Bogosort!
  45. 45. Bogosort• Está em ordem? • Não: embaralhe a lista • Sim: PROFIT!
  46. 46. DesempenhoMatador!
  47. 47. Análise (número de Shuffles)40003000 Mínimo2000 Média Máximo1000 03 elementos 4 elementos 5 elementos 6 elementos
  48. 48. + Análise (número de Shuffles)4000030000 Mínimo20000 Média Máximo10000 0 3 4 5 6 7
  49. 49. + Análise (número de Shuffles)15000001125000 Mínimo 750000 Média Máximo 375000 0 3 4 5 6 7 8 9
  50. 50. 10 elementos!70000005250000 Mínimo3500000 Média Máximo1750000 0 3 4 5 6 7 8 9 10
  51. 51. Extrapolando um pouco
  52. 52. FFFFFFFFFUUUUUUUUUUUUUUUUU
  53. 53. Perguntas?• Ikke Pereira (henriquep@acm.org) @ikkebr• Rodolpho Eckhardt (me@rodolphoeck.com) @rodolphoeck

×