A melhor maneira de acrescentar uma string a uma variável de string é usar +
or +=
. Isso ocorre porque é legível e rápido. Eles também são rápidos, o que você escolhe é uma questão de gosto, o último é o mais comum. Aqui estão os horários com o timeit
módulo:
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
No entanto, aqueles que recomendam ter listas e anexá-las e depois ingressar nessas listas, fazem isso porque anexar uma string a uma lista é presumivelmente muito rápido em comparação com a extensão de uma string. E isso pode ser verdade, em alguns casos. Aqui, por exemplo, há um milhão de anexos de uma sequência de um caractere, primeiro a uma sequência e depois a uma lista:
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
OK, acontece que, mesmo quando a sequência resultante tem um milhão de caracteres, o acréscimo ainda era mais rápido.
Agora vamos tentar anexar uma cadeia de caracteres de mil caracteres centenas de milhares de vezes:
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
A sequência final, portanto, acaba tendo cerca de 100 MB. Isso foi bem lento, anexar a uma lista era muito mais rápido. Que esse momento não inclua a final a.join()
. Então, quanto tempo isso levaria?
a.join(a):
0.43739795684814453
Oups. Acontece que, mesmo nesse caso, a adição / junção é mais lenta.
Então, de onde vem essa recomendação? Python 2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
Bem, o acréscimo / junção é marginalmente mais rápido lá se você estiver usando sequências extremamente longas (o que geralmente não é, o que você teria com uma sequência de 100 MB de memória?)
Mas o argumento decisivo é o Python 2.3. Onde eu nem mostrarei os horários, porque é tão lento que ainda não terminou. Esses testes de repente levam minutos . Exceto pelo acréscimo / junção, que é tão rápido quanto nos Pythons posteriores.
Sim. A concatenação de strings era muito lenta no Python na era da pedra. Mas no 2.4 não é mais (ou pelo menos o Python 2.4.7), então a recomendação para usar append / join ficou desatualizada em 2008, quando o Python 2.3 parou de ser atualizado e você deveria ter parado de usá-lo. :-)
(Atualização: Acontece que quando eu fiz o teste com mais cuidado do que usando +
e +=
é mais rápido para duas seqüências de caracteres no Python 2.3 também. A recomendação de uso ''.join()
deve ser um mal-entendido)
No entanto, este é CPython. Outras implementações podem ter outras preocupações. E essa é apenas mais uma razão pela qual a otimização prematura é a raiz de todo mal. Não use uma técnica que seja "mais rápida", a menos que você a avalie primeiro.
Portanto, a versão "melhor" para concatenação de cadeias de caracteres é usar + ou + = . E se isso for lento para você, o que é bastante improvável, faça outra coisa.
Então, por que eu uso muito acréscimo / ingresso no meu código? Porque às vezes é realmente mais claro. Especialmente quando o que você deve concatenar deve ser separado por espaços, vírgulas ou novas linhas.