2012-08-27 16 views
6

Quando devo confrontare il contenuto di due oggetti array-come - per esempio list s, tuple s o collection.deque s - senza riguardo per il tipo di oggetti, io usoQuali sono i modi migliori per confrontare il contenuto di due oggetti di tipo elenco?

list(an_arrayish) == list(another_arrayish) 

C'è qualche modo più idiomatico/più veloce/migliore per raggiungere questo obiettivo?

+1

Ogni possibilità di cha il titolo di "Qual è il modo più veloce ..."? Lanciare entrambe le liste come tuple aumenta l'uso della memoria e non l'ho mai visto presentato come un approccio idiomatico. –

+0

Lo cambierò per chiedere i modi migliori in quanto sono ugualmente interessato al modo più veloce e leggibile. – Erik

risposta

4

confrontarlo elementwise:

def compare(a,b): 
    if len(a) != len(b): 
     return False 
    return all(i == j for i,j in itertools.izip(a,b)) 

Per Python 3.x, utilizzare zip invece

+2

Utilizzando il benchmark di cui sopra, si ottengono tempi di circa 9-10 secondi. – Ryan

+2

@minitech Questo è previsto perché i loop Python sono ovviamente molto più lenti dei loop C. Ma non farà mai saltare in aria la tua memoria perché non richiede il raddoppio della memoria come fa l'approccio tuple/list. Inoltre, sarà meglio per gli elenchi di diverse dimensioni (o quelli che differiscono nei primi articoli) – JBernardo

+0

minitech: il confronto tra due 1 milione di liste di articoli richiede 200ms sulla mia macchina. Non sono sicuro di quello che stai facendo, ci vuole così tanto tempo. –

0

Tuple ed elenchi vengono confrontati lessicograficamente utilizzando il confronto degli elementi corrispondenti . Ciò significa che per confrontare gli uguali, ogni elemento deve essere uguale e le due sequenze devono essere dello stesso tipo e hanno la stessa lunghezza.

Vedendo che non stiamo correndo nella Convenzione alcune altre lingue usano di "uguaglianza qui significa che stiamo testando se questi riferimenti si riferiscono allo stesso oggetto in memoria" Direi che attaccare con il test di uguaglianza è == il modo più semplice per realizzare questo e quindi il migliore.

+1

Il linguaggio '= di altro linguaggio esiste in Python, sotto forma di 'is'. – Erik

+1

@erik Questo è vero. Non stavo dicendo che non lo era, semplicemente che il comportamento '==' di Python non era in molti altri linguaggi, a meno di scrivere codice come 'my_java_string.equals (your_java_string);' per le variabili di riferimento. Dato che abbiamo questo comportamento (= IMO) più gradevole (IMO), il mio voto va a continuare a usarlo per il caso che hai delineato. – chucksmash

+0

@Eric:> Il linguaggio == di altre lingue esiste in Python, nella forma di è

3

tuple sembrano essere più veloce:

tuple(an_arrayish) == tuple(another_arrayish) 

Ecco un rapido punto di riferimento:

>>> timeit.Timer('list(a) == list(b)', 'a, b = (1, 2, 3, 4, 5), (1, 2, 3, 4, 6)').timeit() 
2.563981056213379 
>>> timeit.Timer('list(a) == list(b)', 'a, b = [1, 2, 3, 4, 5], [1, 2, 3, 4, 6]').timeit() 
2.4739551544189453 
>>> timeit.Timer('tuple(a) == tuple(b)', 'a, b = (1, 2, 3, 4, 5), (1, 2, 3, 4, 6)').timeit() 
1.3630101680755615 
>>> timeit.Timer('tuple(a) == tuple(b)', 'a, b = [1, 2, 3, 4, 5], [1, 2, 3, 4, 6]').timeit() 
1.475499153137207 
Problemi correlati