Eine schnelle Performance-Test Lutz-Lösung zeigt, ist die beste:
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)
Dies sind die Ergebnisse auf meiner Maschine sind:
# 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
Offensichtlich jede künstliche Leistungsprüfung sollte genommen werden ein Körnchen Salz, aber seit der set().intersection()
Antwort ist mindestens so schnell als die anderen Lösungen, und auch die meisten Readab le, sollte es die Standardlösung für dieses allgemeine Problem sein.
Ein Wort der Warnung ist die Liste Verständnis * nicht * unbedingt die schnellere Option. Bei größeren Mengen (bei denen die Leistung wahrscheinlich am wichtigsten ist) wird der bitweise Vergleich ('&') oder 'set (a) .intersection (b)' so schnell oder schneller sein wie das Listenverständnis. – Joshmaker
Noch eine Vorsichtsmaßnahme: Das Listenverständnis findet die Werte, die in beiden an den GLEICHEN Positionen erscheinen (das ist, was SilentGhost mit "Auftrag ist signifikant" meint). Die Set-Schnittpunkt-Lösungen finden auch Übereinstimmungen an VERSCHIEDENEN Positionen. Dies sind Antworten auf 2 ganz unterschiedliche Fragen ... (die Frage des Ops ist mehrdeutig, um welche Frage es sich handelt) – drevicko
Wie machen Sie das, wenn Ihre Listen Listen von Listen sind, dh a = [[0,0], [1, 0]] und b = [[2,3], [0,0]] – Schneems