Ich lese gerade eine andere Benutzerfrage, während ich nach einer Möglichkeit suche, die Unterschiede in zwei Listen zu berechnen.
Python, berechnen Sie die Listendifferenz
Meine Frage ist, warum sollte ich
tun %Vor%anstatt zu tun
%Vor%edit: gerade bemerkt, dass die zweite Diff-Funktion tatsächlich die Ähnlichkeiten zurückgibt. Es sollte jetzt korrekt sein.
Nur aus einer algorithmischen Perspektive braucht es O(n)
, um die Menge zu konstruieren, und O(n)
, um das Listenverständnis zu machen (seit dem Testen, ob ein Element in einer Menge enthalten ist, ist O(1)
). Im zweiten Beispiel würde jedoch O(n^2)
zum Durchlaufen beider Listen benötigt. Also, unabhängig von der Programmiersprache, ist der erste Ansatz überlegen.
Auch list comprehensions in python ist von Natur aus schneller als eine for-Schleife. Dies reduziert den konstanten Faktor noch mehr (und dies auch signifikant). Der Grund dafür kann in diesem Post zusammengefasst werden, den ich hier zitiere:
Die Tatsache, dass Listenkompressen nur enthalten sein können Ausdrücke, nicht Aussagen, ist ein beträchtlicher Faktor, ebenso viel weniger Arbeit ist hinter den Kulissen für jede Iteration erforderlich. Ein weiterer Faktor ist, dass der zugrundeliegende Iterationsmechanismus für Listenkompressen ist viel näher an einer C-Schleife als die Ausführung einer for-Schleife.
Der Hauptunterschied zwischen den beiden Optionen ist, dass derjenige, der set
verwendet, asymptotisch viel effizienter ist.
Unter ziemlich günstigen Bedingungen kann das Nachschlagen eines Gegenstands in einem Satz in O(1)
time erfolgen; Das Nachschlagen eines Elements in einer Liste erfordert O(n)
time.
Der zweite, weniger signifikante Unterschied besteht darin, dass eine Version ein Listenverständnis verwendet, während die andere eine for
-Schleife verwendet. List-Comprehensions erzeugen tendenziell kompakteren Code. Sie neigen auch dazu, effizienter zu sein (obwohl, wenn Leistung ein Anliegen ist, der einzige Weg, um ein genaues Bild zu erhalten, ist, Benchmarks zu laufen).
Das Verständnis von Listen wird im Allgemeinen als effizienter angesehen als die Verwendung normaler Listenoperationen beim Erstellen einer Liste. Wenn Speicher ein Problem ist, können Sie stattdessen einen Generator verwenden.
Dies bietet ein paar Informationen zu den Leistungen von for
-loops, map
und %Code%. @benhoyt hat auch einen nützlichen Link zum Vergleichen von Schleifen und Listenverstehen bereitgestellt.
Bitte beachten Sie jedoch, dass es sich bei einer spezifischen Leistung lohnt, Ihre verschiedenen Optionen zu testen, um die beste Option für Ihre spezifischen Anforderungen auszuwählen.
Ich habe einige Tests gemacht:
test_lists.py
%Vor%test_set_list_comprehensions.py
%Vor%test_set.py
%Vor%Und genau das sagt Timeit:
%Vor%So scheint es am besten zu sein:
test_set.py
%Vor%Tags und Links python