Como o Python string
não pode ser alterado, eu queria saber como concatenar uma string com mais eficiência?
Eu posso escrever assim:
s += stringfromelsewhere
ou assim:
s = []
s.append(somestring)
later
s = ''.join(s)
Enquanto escrevia essa pergunta, encontrei um bom artigo falando sobre o tópico.
http://www.skymind.com/~ocrow/python_string/
Mas está no Python 2.x., então a pergunta seria: algo mudou no Python 3?
python
string
python-3.x
concat
Máx.
fonte
fonte
Respostas:
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 otimeit
módulo: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:
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 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?Oups. Acontece que, mesmo nesse caso, a adição / junção é mais lenta.
Então, de onde vem essa recomendação? Python 2?
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.
fonte
Se você está concatenando muitos valores, nenhum deles. Anexar uma lista é caro. Você pode usar o StringIO para isso. Especialmente se você estiver desenvolvendo várias operações.
Se você já tiver uma lista completa retornada de outra operação, basta usar o
''.join(aList)
Da FAQ do python: Qual é a maneira mais eficiente de concatenar muitas strings juntas?
Edit: Eu era bobo e tinha os resultados colados para trás, fazendo parecer que anexar a uma lista era mais rápido que o cStringIO. Também adicionei testes para bytearray / str concat, bem como uma segunda rodada de testes usando uma lista maior com cadeias maiores. (python 2.7.3)
exemplo de teste ipython para grandes listas de strings
fonte
cStringIO
não existe no Py3. Use emio.StringIO
vez disso.No Python> = 3.6, a nova string f é uma maneira eficiente de concatenar uma string.
fonte
O método recomendado ainda é usar anexar e ingressar.
fonte
Se as seqüências de caracteres que você está concatenando forem literais, use concatenação literal de String
Isso é útil se você quiser comentar parte de uma string (como acima) ou se desejar usar strings brutas ou aspas triplas para parte de um literal, mas não todos.
Como isso acontece na camada de sintaxe, ele usa zero operadores de concatenação.
fonte
Você escreve esta função
Então você pode ligar simplesmente para onde quiser
fonte
str_join = lambda *str_list: ''.join(s for s in str_list)
Usar concatenação de string no local por '+' é o pior método de concatenação em termos de estabilidade e implementação cruzada, pois não suporta todos os valores. O padrão PEP8 desencoraja isso e incentiva o uso de format (), join () e append () para uso a longo prazo.
Conforme citado na seção "Recomendações de programação" vinculada:
fonte
Embora um pouco datado, código gosta de uma Pythonista: Idiomatic Python recomenda
join()
ao longo+
desta seção . Assim como PythonSpeedPerformanceTips em sua seção sobre concatenação de strings , com o seguinte aviso:fonte
Como o @jdi menciona, a documentação do Python sugere usar
str.join
ouio.StringIO
para concatenação de strings. E diz que um desenvolvedor deve esperar um tempo quadrático+=
em um loop, mesmo que haja uma otimização desde o Python 2.4. Como esta resposta diz:Vou mostrar um exemplo de código do mundo real que ingenuamente se baseou
+=
nessa otimização, mas não se aplicou. O código abaixo converte uma sequência iterável de sequências curtas em partes maiores para serem usadas em uma API em massa.Esse código pode funcionar literariamente por horas devido à complexidade do tempo quadrático. Abaixo estão alternativas com estruturas de dados sugeridas:
E uma micro-referência:
fonte
Você pode fazer de maneiras diferentes.
Eu criei este pequeno resumo através dos seguintes artigos.
fonte
meu caso de uso foi ligeiramente diferente. Eu tive que construir uma consulta em que mais de 20 campos fossem dinâmicos. Eu segui essa abordagem de usar o método format
isso foi comparativamente mais simples para mim, em vez de usar + ou de outras maneiras
fonte
Você pode usar isso (mais eficiente) também. ( /software/304445/why-is-s-better-than-for-concatenation )
fonte