2012-09-13 10 views
5

Me pregunto si hay alguna buena razón para preferir una lista en una tupla o viceversa en python if statments. ¿Entonces los siguientes son funcionalmente equivalentes pero es uno preferible al otro en términos de rendimiento y estilo de codificación o no importa?Uso de listas y tuplas en Python if declaraciones

if x in (1,2,3): 
    foo() 

if x in [1,2,3]: 
    foo() 

que parecen haber caído en el hábito de usar tuplas si hay 2 o 3 valores y listas para nada más, creo que porque en mi experiencia tuplas tienden a ser cortas y largas listas, pero esto parece una un poco arbitrario y probablemente innecesariamente inconsistente.

Me interesaría cualquier ejemplo que las personas puedan dar sobre dónde uno sería mejor que el otro.

Saludos

+3

es preferible a ambos aquí – GP89

+0

Posible engaño de [la diferencia entre listas y tuplas] (http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples-in-python) o [lista de python contra tupla cuando se usa cada uno] (http://stackoverflow.com/questions/1708510/python-list -vs-tuple-when-to-use-each). – DSM

+0

@ GP89: ¿Me gustaría elaborar? – voithos

Respuesta

5

La inicialización de un tuple (al menos en CPython) produce menos bytecode que un list - pero realmente no es nada de qué preocuparse. Creo que las pruebas de membresía son prácticamente las mismas (aunque no probadas).

Para la mera prueba de membresía, la semántica de búsqueda es la misma. A partir de Python 2.7 en adelante, es mucho más agradable para escribir (y añade una implicación que es la prueba de miembros solamente):

if x in {1, 2, 3}: 
    pass # do something 

Mientras que antes de que:

if x in set([1,2,3]): 
    pass # do something 

sólo se veía un poco kludgy ...

+0

Gracias por la explicación. Para ser sincero, no me había dado cuenta de que podías crear un conjunto usando '{}' en 2.7, ¡como dices, la implicación de las pruebas de membresía con un conjunto es mucho más satisfactoria! – redrah

+1

Hice algunas sincronizaciones y descubrí que las pruebas de membresía en un conjunto literal son * más lentas * que las pruebas de membresía en un literal de tupla.Esto probablemente se deba al tiempo que lleva crear el conjunto. Cuanto más largo era el conjunto literal, peor se volvía el rendimiento, incluso cuando los elementos probados no eran miembros del conjunto. La conclusión es que si vas a crear un conjunto para probar la membresía solo una vez, estarás mejor con una tupla. Si necesita realizar la prueba más de una vez, se prefiere el conjunto. –

+1

@StevenRumbalski, me alegro de que lo hayas probado, lo sospeché. La clave es que, como dice Jon Clements anteriormente, "la inicialización de una tupla (al menos en CPython) produce menos bytecode que una lista". No es solo que lleva más tiempo producir una tupla que un conjunto; es que la tupla se produce una sola vez en el momento de la compilación y luego [plegada] (http://en.wikipedia.org/wiki/Constant_folding) en el bytecode como una constante, lo que es posible, por supuesto, porque las tuplas son inmutables. . Sin embargo, hay otra complicación más: si la tupla contiene valores mutables, el plegado constante _no ocurre_. – senderle

0

La diferencia entre la lista y la tupla es que las listas son mutables y tuplas son inmutables.

La gente tiende a usar tuplas para colecciones heterogéneas, similares a estructuras en C, y las listas son para las colecciones homogéneas, similar a las matrices en C.

Cuestiones relacionadas