La mejor manera de agregar una cadena a una variable de cadena es usar +
o +=
. Esto se debe a que es legible y rápido. También son igual de rápidos, el que elijas es cuestión de gustos, el último es el más común. Aquí hay tiempos con el timeit
módulo:
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
Sin embargo, aquellos que recomiendan tener listas y agregarlas y luego unirse a esas listas, lo hacen porque agregar una cadena a una lista es presumiblemente muy rápido en comparación con extender una cadena. Y esto puede ser cierto, en algunos casos. Aquí, por ejemplo, hay un millón de anexos de una cadena de un carácter, primero a una cadena, luego a una lista:
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
OK, resulta que incluso cuando la cadena resultante tiene un millón de caracteres, la adición fue aún más rápida.
Ahora intentemos agregar una cadena larga de mil caracteres cien mil veces:
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
La cadena final, por lo tanto, termina teniendo aproximadamente 100 MB de longitud. Eso fue bastante lento, agregar a una lista fue mucho más rápido. Que ese momento no incluye la final a.join()
. Entonces, ¿cuánto tiempo tomaría eso?
a.join(a):
0.43739795684814453
Oups Resulta que incluso en este caso, agregar / unir es más lento.
Entonces, ¿de dónde viene esta recomendación? Python 2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
Bueno, agregar / unir es marginalmente más rápido allí si está usando cadenas extremadamente largas (que generalmente no es así, ¿qué tendría una cadena que tiene 100 MB de memoria?)
Pero el factor decisivo real es Python 2.3. Donde ni siquiera te mostraré los tiempos, porque es tan lento que aún no ha terminado. Estas pruebas de repente toman minutos . Excepto por el append / join, que es tan rápido como en Python posteriores.
Sip. La concatenación de cuerdas fue muy lenta en Python en la edad de piedra. Pero en 2.4 ya no está (o al menos Python 2.4.7), por lo que la recomendación de usar append / join quedó obsoleta en 2008, cuando Python 2.3 dejó de actualizarse, y debería haber dejado de usarlo. :-)
(Actualización: Resulta que cuando hice las pruebas con más cuidado que usar +
y también +=
es más rápido para dos cadenas en Python 2.3. La recomendación de uso ''.join()
debe ser un malentendido)
Sin embargo, esto es CPython. Otras implementaciones pueden tener otras preocupaciones. Y esta es solo otra razón por la cual la optimización prematura es la raíz de todo mal. No use una técnica que se supone "más rápida" a menos que primero la mida.
Por lo tanto, la "mejor" versión para hacer la concatenación de cadenas es usar + o + = . Y si eso resulta lento para usted, lo cual es bastante improbable, haga otra cosa.
Entonces, ¿por qué uso mucho agregar / unir en mi código? Porque a veces es más claro. Especialmente cuando lo que deba concatenar juntos debe estar separado por espacios o comas o líneas nuevas.