BS&TRAP
  #bstrap
  Ikke Pereira
 Rodolpho Eck
NinjaSort
MonkeySort
EstouComSort
Fluxograma
Comentários
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
Nome de Variáveis?
Seja descritivo também!

strNome

intIdade

blnLogado

dctValores
Mas não f*&&*!!

strNumeroDoPedido

varValor

blnPago = ‘S’

objConjuntoDosValoresCujosNomesNaoCabe
Bound methods
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]
Por que??

• Substitua lookups globais com lookups
  locais!!
Exemplo
       (não otimizado)
def one_third(x):
     return x / 3.0

def make_table(pairs):
     result = []
     for value in pairs:
          x = one_third(value)
          result.append(
              format(value, '9.5f’))
     return 'n'.join(result)
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)
Inferno de uma letra
import os,sys
C=os.chdir
S=os.system
M=os.mkdir
J=os.path.join
A=os.path.abspath
D=os.path.dirname
E=os.path.exists
W=sys.stdout.write
V=sys.argv
X=sys.exit
ERR=lambda m:W(m+"n")
PRNT=lambda m:W(m+"n") assert len(V)==2,"you must provide a
sandbox 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)
Vetorização
Por que??




Substitua um loop “for” com uma chamada de
                 função C!
Exemplos!!

[[ord ord(c) for c in long_string]]




    list(map(ord, long_string))
Exemplos!!
     [i**2 for i in range(100)]




list(map(pow, count(0), repeat(2, 100))
Lambda infection!
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)):
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(lambda
l: l[1], lstResults)]


sum = lambda lst: lst and reduce(lambda x, y: x +
y, lst) or 0


assert reduce(lambda x,y: x or y, [z.id ==
event.id for z in events])
kwargs mutáveis
Why brother?

def nao_faz_o_que_vc_acha(item, lista=[]):
    ...
    lista.append(item)
    ...
    return lista
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']
Mas tio....

def aprendi_tio(item, lista=None):
    l = lista or []
    ...
    l.append(item)
    ...
    return l
LRU Cache
Fibonacci

•fibonacci(n):
 •n <= 1: n
 •n > 1: fibonacci(n-1)   +
         fibonacci(n-2)
n00b

def fibonacci(n):
    if n <= 1:
        return n
    return (fibonacci(n-1) +
            fibonacci(n-2))
LRU Cache
import functools

@functools.lru_cache()
def fibonacci(n):
    if n <= 1:
        return n
    return (fibonacci(n-1) +
            fibonacci(n-2))
Código bonito de se ver
from regrets        import unfortunate_choices

class 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’}
from regrets        import unfortunate_choices

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’}
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’}
Metodologia
eXtreme Go Horse (extreme)
http://gohorseprocess.wordpress.com/
Pensou, não é XGHx.
Não existe refactoring.
   Apenas rework.
Se tiver funcionando, não
         rela a mão.
Testes são pros fracos.
Fear Driven Development
Bogosort!
Bogosort

• Está em ordem?
 • Não: embaralhe a lista
 • Sim: PROFIT!
Desempenho



Matador!
Análise (número de Shuffles)
4000


3000

                                                        Mínimo
2000                                                    Média
                                                        Máximo

1000


    0
3 elementos   4 elementos   5 elementos   6 elementos
+ Análise (número de
                  Shuffles)
40000


30000

                                   Mínimo
20000                              Média
                                   Máximo

10000


    0
        3       4    5   6    7
+ Análise (número de
          Shuffles)
1500000


1125000

                                   Mínimo
 750000                            Média
                                   Máximo

 375000


      0
       3   4   5   6   7   8   9
10 elementos!
7000000


5250000

                                        Mínimo
3500000                                 Média
                                        Máximo

1750000


      0
       3   4   5   6   7   8   9   10
Extrapolando um pouco
FFFFFFFFFUUU
UUUUUUUUUU
UUUU
Perguntas?



• Ikke Pereira (henriquep@acm.org)
  @ikkebr

• Rodolpho Eckhardt (me@rodolphoeck.com)
  @rodolphoeck
Bogosort e Técnicas Realmente Avançadas de Programação

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