Gibt es irgendwelche Gründe, kein geordnetes Wörterbuch zu benutzen?

Ich beziehe mich auf das OrderedDict aus dem collections .

Wenn es die hinzugefügte Funktionalität hat, um zu bestellen, was ich realisiere, kann oft nicht notwendig sein, aber auch so, gibt es irgendwelche Nachteile? Ist es langsamer? Fehlt mir jede Funktionalität? Ich habe keine fehlenden Methoden gesehen.

Kurz gesagt, warum sollte ich das nicht immer anstelle eines normalen Wörterbuches verwenden?

  • Warum ist die Übersetzung nicht deterministisch?
  • Was passiert, wenn man `if key in dict` anruft
  • Verschachtelte Liste mit Zählgruppen zu dict
  • Holen Sie sich die Liste aller möglichen Dict-Konfigurationen in Python
  • Kombinieren von zwei Python-Wörterbüchern zu einem, wenn die Netto-Werte nicht positiv sind
  • Verlieren von Elementen in Python-Code beim Erstellen eines Wörterbuchs aus einer Liste?
  • Multi-Level-Standarddict mit variabler Tiefe?
  • Wie man sucht, wenn der Wörterbuchwert bestimmte Zeichenfolge mit Python enthält
  • 2 Solutions collect form web for “Gibt es irgendwelche Gründe, kein geordnetes Wörterbuch zu benutzen?”

    OrderedDict ist eine Unterklasse von dict , und braucht mehr Speicher, um die Reihenfolge zu behalten, in der Schlüssel hinzugefügt werden. Das ist nicht trivial. Die Implementierung fügt ein zweites dict unter die Cover und eine doppelt verknüpfte Liste aller Schlüssel (das ist der Teil, der sich an den Auftrag erinnert) und eine Reihe von Schwachprofilen. Es ist nicht viel langsamer, aber zumindest verdoppelt das Gedächtnis über die Verwendung eines einfachen dict .

    Aber wenn es angebracht ist, verwenden Sie es! Deshalb ist es da 🙂

    Wie es funktioniert

    Die Basis dict ist nur eine gewöhnliche dict Mapping Schlüssel zu Werten – es ist überhaupt nicht "bestellt". Wenn ein <key, value> Paar hinzugefügt wird, wird der key an eine Liste angehängt. Die Liste ist der Teil, der sich an den Auftrag erinnert.

    Aber wenn dies eine Python-Liste wäre, würde das Löschen eines Schlüssels O(n) Zeit zweimal übernehmen: O(n) Zeit, um den Schlüssel in der Liste zu finden, und O(n) Zeit, um den Schlüssel aus der Liste zu entfernen.

    So ist es eine doppelt verknüpfte Liste. Das macht das Löschen einer Schlüsselkonstante ( O(1) ) Zeit. Aber wir müssen noch den doppelt verknüpften Listenknoten des Schlüssels finden. Um diese Operation O(1) Zeit zu machen, bildet ein zweites – verstecktes Diagramm die Schlüssel zu den Knoten in der doppelt verknüpften Liste.

    Das Hinzufügen eines neuen <key, value> -Paares erfordert das Hinzufügen des Paares zum Basis-Dict, das Erstellen eines neuen doppelt verknüpften Listenknotens, um den Schlüssel zu halten, diesen neuen Knoten an die doppelt verknüpfte Liste anzuhängen und den Schlüssel zu dem neuen zuzuordnen Knoten im versteckten Dict. Ein bisschen über doppelt so viel Arbeit, aber immer noch O(1) (erwarteter Fall) Zeit insgesamt.

    Ähnlich ist das Löschen eines Schlüssels, der vorhanden ist, auch ein bisschen mehr als doppelt so viel Arbeit, aber O(1) erwartete Zeit insgesamt: Verwenden Sie das versteckte Dict, um den doppelt verknüpften Listenknoten des Schlüssels zu finden, diesen Knoten aus der Liste zu löschen und den Schlüssel zu entfernen Von beiden dicts

    Etc. Es ist sehr effizient.

    Multithreading

    Wenn dein Wörterbuch aus mehreren Threads ohne Sperre, insbesondere als Synchronisationspunkt, abgerufen wird.

    Vanille-Dict-Operationen sind atomar, und jede Art, die in Python erweitert wird, ist nicht.

    In der Tat bin ich nicht einmal gewisse OrderedDict ist Thread-Safe (ohne Sperre), obwohl ich die Möglichkeit nicht beschränken kann, dass es sehr sorgfältig codiert wurde und die Definition von Reentrancy befriedigt.

    Kleinere Teufel

    Speicher-Nutzung, wenn Sie Tonnen dieser Wörterbücher erstellen

    Cpu-Nutzung, wenn alle Ihre Code ist, stürzt diese Wörterbücher

    Python ist die beste Programmiersprache der Welt.