2012-09-13 10 views
5

Mi chiedo se ci siano buoni motivi per preferire una lista sopra una tupla o viceversa in python if stat. Quindi i seguenti sono funzionalmente equivalenti, ma uno è preferibile all'altro in termini di prestazioni e stile di codifica o non importa?Utilizzo di liste e tuple in Python se le istruzioni sono

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

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

mi sembra di aver preso l'abitudine di utilizzare tuple se ci sono 2 o 3 valori e le liste per nulla più, credo perché nella mia esperienza tuple tendono ad essere a breve e lungo le liste, ma questo sembra un bit arbitrario e probabilmente inutilmente incoerente.

Sarei interessato a qualche esempio che le persone possano dare di dove si sarebbe meglio dell'altro.

Acclamazioni

+3

set è preferibile ad entrambi qui – GP89

+0

Possibile dupe di [la differenza tra liste e tuple] (http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples-in-python) o [elenco python rispetto a tuple quando utilizzare ciascuno] (http://stackoverflow.com/questions/1708510/python-list -Vs-pla-quando-per-use-ciascuna). – DSM

+0

@ GP89: cura di elaborare? I set – voithos

risposta

5

L'inizializzazione di un tuple (almeno in CPython) produce meno bytecode di un list - ma non c'è davvero nulla di cui preoccuparsi. Credo che il test di appartenenza sia praticamente lo stesso (anche se non testato).

Per i test di appartenenza puramente la semantica di ricerca è la stessa. Da Python 2.7 in poi, è molto più bello di scrivere (e aggiunge un'implicazione che è il controllo di appartenenza solo):

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

Mentre prima che:

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

solo sembrava un po 'kludgy ...

+0

Grazie per la spiegazione. Ad essere onesti, non mi ero reso conto che potevi creare un set usando '{}' in 2.7, come dici tu le implicazioni del test di appartenenza con un set sono molto più soddisfacenti! – redrah

+1

Ho eseguito alcuni intervalli e ho riscontrato che il test per l'appartenenza a un set letterale è * più lento * rispetto al test per l'appartenenza a una tupla letterale.Ciò è probabilmente dovuto al tempo necessario per creare il set. Più lungo era il valore letterale impostato, peggiore era la performance, anche quando gli elementi testati non erano membri del set. Il takeaway è che se creerai un set per testare l'appartenenza solo una volta, starai meglio con una tupla. Se hai bisogno di test più di una volta, allora il set è preferito. –

+1

@StevenRumbalski, contento che tu abbia provato quello, lo sospettavo. La chiave è che, come dice Jon Clements sopra, "L'inizializzazione di una tupla (almeno in CPython) produce meno bytecode di una lista." Non è solo che ci vuole più tempo per produrre una tupla di un set; è che la tupla viene prodotta solo una volta al momento della compilazione e poi [ripiegata] (http://en.wikipedia.org/wiki/Constant_folding) nel bytecode come costante, il che è possibile, ovviamente, perché le tuple sono immutabili . Tuttavia, c'è un'ulteriore complicazione: se la tupla contiene valori mutabili, la piegatura costante non avviene. – senderle

0

La differenza tra lista e tuple è che le liste sono mutabili e tuple sono immutabili.

Le persone tendono ad utilizzare tuple per collezioni eterogenee, simili a struct in C, e le liste che sono per le collezioni omogenei, simili agli array in C.

Problemi correlati