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

Post on 10-May-2015

776 views 2 download

description

Palestra apresentada no FISL 12.

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

BS&TRAP#bstrap

Ikke PereiraRodolpho 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

#!/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)

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

0

1000

2000

3000

4000

3 elementos 4 elementos 5 elementos 6 elementos

MínimoMédiaMáximo

+ Análise (número de Shuffles)

0

10000

20000

30000

40000

3 4 5 6 7

MínimoMédiaMáximo

+ Análise (número de Shuffles)

0

375000

750000

1125000

1500000

3 4 5 6 7 8 9

MínimoMédiaMáximo

10 elementos!

0

1750000

3500000

5250000

7000000

3 4 5 6 7 8 9 10

MínimoMédiaMáximo

Extrapolando um pouco

FFFFFFFFFUUUUUUUUUUUUUUUUU

Perguntas?

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

• Rodolpho Eckhardt (me@rodolphoeck.com)@rodolphoeck