Un test de performance rapide montrant la solution de Lutz est le meilleur:
import time
def speed_test(func):
def wrapper(*args, **kwargs):
t1 = time.time()
for x in xrange(5000):
results = func(*args, **kwargs)
t2 = time.time()
print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
return results
return wrapper
@speed_test
def compare_bitwise(x, y):
set_x = frozenset(x)
set_y = frozenset(y)
return set_x & set_y
@speed_test
def compare_listcomp(x, y):
return [i for i, j in zip(x, y) if i == j]
@speed_test
def compare_intersect(x, y):
return frozenset(x).intersection(y)
# Comparing short lists
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)
# Comparing longer lists
import random
a = random.sample(xrange(100000), 10000)
b = random.sample(xrange(100000), 10000)
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)
Ce sont les résultats sur ma machine:
# Short list:
compare_bitwise took 10.145 ms
compare_listcomp took 11.157 ms
compare_intersect took 7.461 ms
# Long list:
compare_bitwise took 11203.709 ms
compare_listcomp took 17361.736 ms
compare_intersect took 6833.768 ms
De toute évidence, tout test de performance artificielle doit être prise avec un grain de sel, mais depuis la réponse set().intersection()
est au moins aussi vite que les autres solutions, et aussi le plus readab le, il devrait être la solution standard pour ce problème commun.
Une note de prudence, la compréhension de la liste est * pas * nécessairement l'option plus rapide. Pour les ensembles plus volumineux (où les performances sont les plus susceptibles d'avoir de l'importance), la comparaison de bits ('&') ou 'set (a) .intersection (b)' sera aussi rapide ou plus rapide que la compréhension de liste. – Joshmaker
Une autre note de prudence: la compréhension de la liste trouve les valeurs qui apparaissent dans les deux aux mêmes positions (c'est ce que SilentGhost voulait dire par «l'ordre est significatif»). Les solutions d'intersection définies trouveront également des correspondances à DIFFÉRENTES positions. Ce sont des réponses à 2 questions tout à fait différentes ... (la question de l'op est ambiguë quant à ce qu'elle demande) – drevicko
Comment faites-vous cela si vos listes sont des listes de listes à savoir a = [[0,0], [1, 0]] et b = [[2,3], [0,0]] – Schneems