Python: Concatenação eficiente de strings

Palavras-chave: strings, otimização, concatenação

Em Python as strings são imutáveis e por essa razão, quando concatenamos duas delas usando o operador “+” um novo objeto do tipo string é criado e os objetos originais perdem as suas referências. Se não existe nenhuma outra referência para estes objetos eles serão marcados para serem eliminadas pelo coletor de lixo (garbage collector).

Quando efetuamos um número muito grande de concatenações usando esse método estamos usando de maneira ineficiente os recursos de memória e processamento da máquina simplesmente porque não estamos utilizando a estrutura de dados mais adequada para esta tarefa.

Uma maneira eficiente de fazer essa concatenação é através da utilização de listas (list()) que são estruturas mutáveis e, posteriormente, transformar essa lista de strings em uma única string, concatenando-as com o método join() do objeto str():

# jeito ineficiente
a = ""
for i in range(1000):
   a += "X"
print a # 1000 x 'X'

# jeito eficiente
a = []
for i in range(1000):
   a.append('X')
a = ''.join(a)

Note que a a legibilidade do código fica ligeiramente prejudicada quando usamos o método eficiente de concatenação, portanto, use-o apenas em casos onde um número muito grande de concatenações será feita.

Para programadores que fazem uso ainda mais extensivo de concatenações de strings o módulo cStringIO pode ser interessante.

Veja esta dica em Ruby.

This entry was posted in Python. Bookmark the permalink.

3 Responses to Python: Concatenação eficiente de strings

  1. C. Almeida says:

    Bacana.
    Python é muito diferente ao que estou acostumado e estou me adaptando aos poucos. Valeu a dica

  2. Diego Brito says:

    Muito boa a sua explicação, estou aprendendo python na facul e ainda estou me acostumando com as diferenças. Obrigado por ajudar quem tá no começo.Foi de muita ajuda para um trabalho que estou fazendo. Vlw.

  3. Thiago Teixeira says:

    Estava precisando otimizar um codigo e seu post me ajudou muito.
    Obrigado ^^

Comments are closed.