MungeWord
Primeiro vamos analisar então a função MungeWord que mencionamos no post anterior. Há diversas formas de implementar o que queremos (a primeira e última letras da palavra devem ficar intactas, mas as demais ser embaralhadas) e vou analisar os dois dos modos que testei e uma mistura de ambos. Utilizando índices e slices:
def MungeWord(word):
if not word or not word[0].isalpha() or len(word) <= 2:
return word
middle = list(word[1:-1])
random.shuffle(middle)
return ''.join((word[0], ''.join(middle), word[-1]))
Utilizando pop:
def MungeWord(word):
if len(word) <= 2:
return word
word = list(word)
first = word.pop(0)
last = word.pop()
random.shuffle(word)
return ''.join((first, ''.join(word), last))
E uma mistura de pop e slices:
def MungeWord(word):
if len(word) <= 2:
return word
first = word[0]
word = list(word)
last = word.pop()
middle = word[1:]
random.shuffle(middle)
return ''.join((first, ''.join(middle), last))
Comparando a performance das três funções para tamanhos reais de palavras (menos de 100 letras, por exemplo), a diferença entre elas fica em menos de 0,00001 segundo. Então não há motivos “reais” para dar preferência por uma específica - escolha a mais legível, se quiser; eu, pessoalmente, prefiro pop (a segunda implementação).
Mas por que parar por aí? Vamos levar ao extremo, considerando a existência de palavras com milhares de letras. Um gráfico para mostrar o resultado:

Bom, fica claro que, independente do gosto por uma ou outra implementação, o tempo de execução não é afetado, mesmo com palavras gigantes.
Depois retornarei ao assunto para tratar do consumo de memória e da MungeFile também. :)
Beijos e abraços!






[...] que analisamos a função MungeWord e chegamos à conclusão que todas as implementações apresentadas possuem [...]
MungeFile
6 Jul 08 at 03:14