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

61
BS&TRAP #bstrap Ikke Pereira Rodolpho Eck

description

Palestra apresentada no FISL 12.

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

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

BS&TRAP#bstrap

Ikke PereiraRodolpho Eck

Page 2: Bogosort e Técnicas Realmente Avançadas de Programação
Page 3: Bogosort e Técnicas Realmente Avançadas de Programação

NinjaSort

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

MonkeySort

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

EstouComSort

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

Fluxograma

Page 7: Bogosort e Técnicas Realmente Avançadas de Programação
Page 8: Bogosort e Técnicas Realmente Avançadas de Programação

Comentários

Page 9: Bogosort e Técnicas Realmente Avançadas de Programação
Page 10: Bogosort e Técnicas Realmente Avançadas de Programação

Seja descritivo#!/usr/bin/env python# -*- coding: utf-8 -*-## Autor: Rodolpho Eckhardt <[email protected]># 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

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

Nome de Variáveis?

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

Seja descritivo também!

strNome

intIdade

blnLogado

dctValores

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

Mas não f*&&*!!

strNumeroDoPedido

varValor

blnPago = ‘S’

objConjuntoDosValoresCujosNomesNaoCabe

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

Bound methods

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

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]

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

Por que??

• Substitua lookups globais com lookups locais!!

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

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)

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

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)

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

Inferno de uma letra

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

#!/usr/bin/env pythonimport 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 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)S(CMD)PRNT("All done!")X(0)

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

Vetorização

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

Por que??

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

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

Exemplos!!

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

list(map(ord, long_string))

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

Exemplos!!

[i**2 for i in range(100)]

list(map(pow, count(0), repeat(2, 100))

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

Lambda infection!

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

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)):

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

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])

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

kwargs mutáveis

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

Why brother?

def nao_faz_o_que_vc_acha(item, lista=[]): ... lista.append(item) ... return lista

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

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']

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

Mas tio....

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

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

LRU Cache

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

Fibonacci

•fibonacci(n):

•n <= 1: n

•n > 1: fibonacci(n-1) + fibonacci(n-2)

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

n00b

def fibonacci(n): if n <= 1: return n return (fibonacci(n-1) + fibonacci(n-2))

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

LRU Cacheimport functools

@functools.lru_cache()def fibonacci(n): if n <= 1: return n return (fibonacci(n-1) + fibonacci(n-2))

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

Código bonito de se ver

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

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’}

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

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’}

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

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’}

Page 40: Bogosort e Técnicas Realmente Avançadas de Programação
Page 41: Bogosort e Técnicas Realmente Avançadas de Programação

Metodologia

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

eXtreme Go Horse (extreme)http://gohorseprocess.wordpress.com/

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

Pensou, não é XGHx.

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

Não existe refactoring.Apenas rework.

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

Se tiver funcionando, não rela a mão.

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

Testes são pros fracos.

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

Fear Driven Development

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

Bogosort!

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

Bogosort

• Está em ordem?

• Não: embaralhe a lista

• Sim: PROFIT!

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

Desempenho

Matador!

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

Análise (número de Shuffles)

0

1000

2000

3000

4000

3 elementos 4 elementos 5 elementos 6 elementos

MínimoMédiaMáximo

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

+ Análise (número de Shuffles)

0

10000

20000

30000

40000

3 4 5 6 7

MínimoMédiaMáximo

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

+ Análise (número de Shuffles)

0

375000

750000

1125000

1500000

3 4 5 6 7 8 9

MínimoMédiaMáximo

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

10 elementos!

0

1750000

3500000

5250000

7000000

3 4 5 6 7 8 9 10

MínimoMédiaMáximo

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

Extrapolando um pouco

Page 56: Bogosort e Técnicas Realmente Avançadas de Programação
Page 57: Bogosort e Técnicas Realmente Avançadas de Programação

FFFFFFFFFUUUUUUUUUUUUUUUUU

Page 58: Bogosort e Técnicas Realmente Avançadas de Programação
Page 59: Bogosort e Técnicas Realmente Avançadas de Programação
Page 61: Bogosort e Técnicas Realmente Avançadas de Programação