Bogosort e Técnicas Realmente Avançadas de Programação
-
Upload
rodolphoeck -
Category
Technology
-
view
776 -
download
2
description
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 <[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
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 ([email protected])@ikkebr
• Rodolpho Eckhardt ([email protected])@rodolphoeck