2011-08-05 16 views
8

Al combinar una variable y una cadena para imprimir en Python, parece haber varias formas de hacer lo mismo;Diferencia entre los métodos de impresión/formato de Python

test = "Hello" 
print "{} World".format(test) #Prints 'Hello World' 
print test+" World" #Prints 'Hello World' 
print "%s World" % test #Prints 'Hello World' 

Lo que (si lo hay) es la diferencia entre estos métodos en términos de rendimiento, compatibilidad y preferencia general. Incluso entre proyectos de código abierto, los tres métodos parecen usarse indistintamente.

+1

¿Por qué le preocupa el rendimiento ...de una declaración impresa? ¿Cuánto va a imprimir? Jaja. Todos son más o menos lo mismo. Usa lo que sea que funcione – john

+2

@awfullyjohn Supongo que es más una pregunta teórica que práctica, solo me interesaba si había alguna historia detrás de los diferentes métodos – Smudge

+0

Lea http://www.codinghorror.com/blog/2009/01/the- sad-tragedy-of-micro-optimization-theater.html por sus preocupaciones sobre el rendimiento en este tema (Python y C# tienen implementaciones similares de cadenas, por lo que las conclusiones se aplican por igual) – SingleNegationElimination

Respuesta

8

Como mencionaste, varios proyectos de código abierto usarán todos estos métodos para el formateo de cadenas. Sin embargo, me quedaría con un método para un proyecto para no confundir a otros desarrolladores con diferentes estilos.

print test+" World" es el más eficiente, en cuanto al rendimiento, pero le da la menor cantidad flexibilidad

print "%s World" % test #Prints 'Hello World' es básicamente como C de sprintf lo que hace la interpolación de cadenas. Me gusta usar mucho este método, porque puede pasar no solo una cadena normal, sino un diccionario.

print "Good morning %(name), there are %(count)d new articles in %(topic)s today. Would you like to <a href='%(url)s'>read them</a>?" % values

No he utilizado "{} World".format(test) personalmente.

En aplicaciones reales, la diferencia de rendimiento entre estos métodos es insignificante, y se trata realmente de respetar el estilo y no sobrecodificar.

1

Por lo que sé, el tercer elemento ha quedado en desuso para el primer elemento como se explica en los documentos de python. Se elimina en Python 3.xy superior. El segundo es realmente dos declaraciones juntas, una concatenación de cadenas y una instrucción de impresión de la cadena.

Actualización:

Parece que mi información es un poco apagado. Desde la página what's new in python 3.0:

PEP 3101: Formato de cadena avanzado. Nota: la descripción 2.6 menciona el método format() para cadenas de 8 bits y Unicode. En 3.0, solo el tipo str (cadenas de texto con soporte Unicode) admite este método; el tipo de bytes no. El plan es eventualmente hacer esta es la única API para el formato de cadenas, y para comenzar a desaprobar el operador % en Python 3.1.

+3

"% s"% x no se ha eliminado en Python 3, y probablemente nunca lo será. –

8

Un poco de referencia:

>>> a = lambda: "{} World".format("Hello") 
>>> b = lambda: "Hello" + " World" 
>>> c = lambda: "%s World" % "Hello" 
>>> d = lambda: "".join(("Hello", " World")) 
>>> a(), b(), c(), d() 
('Hello World', 'Hello World', 'Hello World', 'Hello World') 
>>> timeit.timeit(a) 
0.7830071449279785 
>>> timeit.timeit(b) 
0.18782711029052734 
>>> timeit.timeit(c) 
0.18806695938110352 
>>> timeit.timeit(d) 
0.3966488838195801 

parece como b y c son más rápido, después de d, una sorprendentemente a es más lento.

Pero, si no se procesa mucho, realmente no importa cuál usar, solo que es mejor no mezclarlos.

Personalmente prefiero "".join para simples concentuaciones, y str.format para colocar valores, como "Hello, my name is {}.".format(name).

Hubo un rumor de que el formato % se desaprobará y eliminará en Python 3, pero no fue así.

+2

Esto es muy engañoso. Sus conclusiones solo se aplican a pequeñas cantidades de cadenas cortas, no para tipos que no sean cadenas, cadenas más largas o más cadenas. A medida que cambian el número y la longitud de las subcadenas, la velocidad relativa cambiará, especialmente con 'b' cada vez más lenta a medida que las cadenas se vuelven más largas o más numerosas. Además, 'b' y' d' requieren que lo que estás concatenando sean cadenas, mientras que 'a' y' c' no lo hacen. Mientras 'a' y' c' son más o menos similares, 'a' es el más poderoso. – agf

+0

¿En qué paquete está timeit.timeit? Miré a Pypi pero no pude encontrar nada, parece útil – Smudge

+0

@samarudge, timeit :). Solo 'import timeit; timeit.timeit (...) ' – utdemir

Cuestiones relacionadas