2012-08-27 17 views
6

Cuando tengo que comparar el contenido de dos objetos de matriz-como - por ejemplo list s, s tuple o collection.deque s - sin tener en cuenta el tipo de los objetos, uso¿Cuáles son las mejores formas de comparar el contenido de dos objetos similares a listas?

list(an_arrayish) == list(another_arrayish) 

¿Hay alguna ¿Más forma idiomática/más rápida/mejor para lograr esto?

+1

Cualquier posibilidad de cha En el título de "¿Cuál es la manera más rápida ..."? Lanzar ambas listas como tuplas aumenta el uso de memoria, y nunca he visto esto presentado como un enfoque idiomático. –

+0

Lo cambiaré para preguntar por las mejores maneras ya que estoy igualmente interesado en el más rápido de la manera más legible. – Erik

Respuesta

4

compararlo elementwise:

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

Para Python 3.x, utilice zip lugar

+2

Usando la referencia anterior, esto da tiempos de alrededor de 9-10 segundos. – Ryan

+2

@minitech Esto se espera porque los bucles de Python son obviamente mucho más lentos que los bucles de C. Pero nunca explotará tu memoria porque no requiere doblar el almacenamiento como lo hace el enfoque de tupla/lista. Además, será mejor para listas de diferentes tamaños (o que difieren en los primeros elementos) – JBernardo

+0

minitech: Comparar dos listas de 1 millón de elementos lleva 200ms en mi máquina. No estoy seguro de lo que estás haciendo que lleva tanto tiempo. –

0

Las tuplas y listas se comparan lexicográficamente mediante la comparación de los elementos correspondientes de . Esto significa que para comparar iguales, cada elemento debe ser igual y las dos secuencias deben ser del mismo tipo y tienen la misma longitud.

Al ver que no estamos corriendo en la convención de algunos otros lenguajes usan de "igualdad significa aquí estamos probando si estas referencias se refieren al mismo objeto en la memoria" Yo diría que pegando con la prueba de la igualdad es == la forma más sencilla de lograr esto y, por lo tanto, la mejor.

+1

El otro idioma '==' existe en Python, en forma de 'is'. – Erik

+1

@erik Esto es cierto. No estaba argumentando que no lo era, simplemente que el comportamiento '==' de Python no estaba en muchos otros lenguajes, salvo escribir código como 'my_java_string.equals (your_java_string);' para variables de referencia. Dado que tenemos este (IMO) mejor comportamiento '==', mi voto va a seguir usándolo para el caso que ha descrito. – chucksmash

+0

@Eric:> Other language == existe en Python, en la forma de is

3

Tuplas parece ser más rápido:

tuple(an_arrayish) == tuple(another_arrayish) 

Aquí es un punto de referencia rápida:

>>> 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 
Cuestiones relacionadas