Python-Wörterbuch vs If-Anweisung Geschwindigkeit

8

Ich habe ein paar Links gefunden, die über Switch-Fälle sprechen, die in C ++ schneller sind als wenn sonst, weil sie beim Kompilieren optimiert werden können. Ich fand dann einige Vorschläge, die Leute hatten, dass die Verwendung eines Wörterbuchs schneller als eine If-Anweisung sein kann. Allerdings sind die meisten der Konversation über jemandes Arbeit Ende nur am Ende diskutieren, dass sie zuerst andere Teile des Codes optimieren sollten und es ist nicht wichtig, es sei denn, Sie tun Millionen von wenn sonst. Kann jemand erklären, warum das ist?

Angenommen, ich habe 100 eindeutige Zahlen, die ständig in einen Python-Code gestreamt werden. Ich möchte überprüfen, um welche Nummer es sich handelt, und dann etwas ausführen. Also könnte ich entweder eine Menge tun, wenn sonst, oder ich könnte jede Zahl in ein Wörterbuch setzen. Um der Sache willen sagen wir mal einen einzigen Thread.

Kennt jemand die Ebene zwischen Python und der Ausführung auf niedriger Ebene, die erklären kann, wie das funktioniert?

Danke:)

    
user1938107 10.04.2013, 10:50
quelle

2 Antworten

10
  

Allerdings handelt es sich bei der Konversation hauptsächlich um das Ende eines Arbeitstages   darüber diskutieren, dass sie zuerst andere Teile des Codes optimieren sollten   und es wird nicht wichtig sein, es sei denn, du machst Millionen von sonst. Kann jemand   erklären, warum das ist?

Im Allgemeinen sollten Sie sich die Mühe machen, den Code zu optimieren, wenn Sie das wirklich brauchen, d. h. wenn die Leistung des Programms unbrauchbar langsam ist.

Wenn dies der Fall ist, sollten Sie einen Profiler verwenden, um festzustellen, welche Teile tatsächlich die meisten Probleme verursachen. Für Python ist das cProfile -Modul dafür ziemlich gut geeignet.

  

Versteht jemand die Ebene zwischen Python und der niedrigen Ebene?   Ausführung, die erklären kann, wie das funktioniert?

Wenn Sie wissen möchten, wie Ihr Code ausgeführt wird, sehen Sie sich die Seite an Modul.

Ein schnelles Beispiel ...

%Vor%

... welche Ausgaben ...

%Vor%

... so ist es ziemlich einfach zu sehen, welche Funktion die meisten Anweisungen ausführen muss.

Was tatsächlich schneller ist, müssen Sie überprüfen, indem Sie den Code profilieren.

    
Aya 10.04.2013, 11:53
quelle
5

Die Struktur if / elif / else vergleicht den Schlüssel, den er erhalten hat, mit einer Folge von möglichen Werten, bis er eine Übereinstimmung in der Bedingung einer if-Anweisung findet und dann liest, was er innerhalb des if ausführen soll Block. Dies kann sehr lange dauern, da für jede Suche so viele Prüfungen ( n/2 im Durchschnitt, für n mögliche Werte) durchgeführt werden müssen.

Der Grund dafür, dass eine Sequenz von if-Anweisungen schwieriger zu optimieren ist als eine switch-Anweisung, besteht darin, dass die Bedingungsprüfungen (was sich in C ++ in den Parens befindet) möglicherweise den Status einiger Variablen ändert, die an der nächsten Überprüfung beteiligt sind müssen sie in der Reihenfolge tun. Die Einschränkungen der Switch-Anweisungen entfernen diese Möglichkeit, so dass die Reihenfolge keine Rolle spielt (denke ich).

Python-Wörterbücher sind als Hash-Tabellen implementiert . Die Idee ist folgende: Wenn Sie mit beliebig großen Zahlen arbeiten könnten und unendliches RAM hätten, könnten Sie ein riesiges Array von Funktionszeigern erstellen, indem Sie den Lookup-Wert in eine ganze Zahl umwandeln und diesen als Index verwenden. Nachschlagen wäre praktisch sofort.

Sie können das natürlich nicht, aber Sie können ein Array mit einer verwaltbaren Länge erstellen und den Lookup-Wert an Hash-Funktion (die abhängig vom Suchwert eine ganze Zahl generiert), dann % das Ergebnis mit der Länge Ihres Arrays, um einen Index innerhalb der Grenzen dieses Arrays zu erhalten. Auf diese Weise benötigt die Suche so viel Zeit, wie benötigt wird, um die Hash-Funktion einmal aufzurufen, den Modulus zu übernehmen und zu einem Index zu springen. Wenn die Menge verschiedener möglicher Nachschlagewerte groß genug ist, wird der Overhead der Hash-Funktion im Vergleich zu diesen n/2 -Zustandsüberprüfungen vernachlässigbar.

(Da viele verschiedene Lookup-Werte unweigerlich dem gleichen Index zugeordnet werden, ist es nicht ganz so einfach. Sie müssen nach möglichen Konflikten suchen und diese lösen, was auf verschiedene Arten möglich ist es ist wie oben beschrieben.)

    
alcedine 10.04.2013 11:14
quelle