Python-äquivalent zu std::set und std::multimap
Ich bin Portierung eines C++ - Programms zu Python. Es gibt einige Orte, wo es verwendet std::set
um Objekte zu speichern, dass Sie Ihre eigenen Vergleichs-Operatoren. Da die Python-standard-Bibliothek hat keine Entsprechung der std::set
(einer sortierten key-value-mapping-Daten-Struktur), und ich habe versucht, mit einem normalen Wörterbuch und Sortieren dann, wenn die Iteration, wie diese:
def __iter__(self):
items = self._data.items()
items.sort()
return iter(items)
Jedoch profiling gezeigt hat, dass alle Anrufe von .sort()
zu __cmp__
sind ein Engpass. Ich brauche eine bessere Daten-Struktur - im wesentlichen ein sortiertes Wörterbuch. Kennt jemand eine bestehende Anwendung? Gelingt das nicht, irgendwelche Empfehlungen, wie ich diese umsetzen? Lese-performance ist wichtiger als schreiben, Leistung und Zeit ist wichtiger als Speicher.
Bonus-Punkte, wenn es unterstützt mehrere Werte pro Schlüssel, wie die C++ std::multimap
.
Beachten Sie, dass die OrderedDict
- Klasse passt nicht zu meinen Bedürfnissen, denn es gibt Elemente in der Reihenfolge einfügen, in der Erwägung, dass ich Sie brauche sortiert mit Ihren __cmp__
Methoden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für die sortierte Wörterbuch, können Sie (ab -) Nutzung die stabile Natur von python timsort: im Grunde, halten Sie die Gegenstände, teilweise sortiert, Elemente anfügen am Ende, wenn nötig, schalten Sie eine "dirty" - flag, und Sortieren Sie die restlichen vor der Iteration. Siehe diesen Eintrag für details und Durchführung (Martelli Antwort):
Key-bestellt dict in Python
Sollten Sie verwenden
sort(key=...)
.Die wichtige Funktion, die Sie verwenden, wird im Zusammenhang mit der cmp, die Sie bereits verwenden. Der Vorteil ist, dass die zentrale Funktion heißt n-mal in der Erwägung, dass das cmp ist aufgerufen, nlog n-mal, und in der Regel Schlüssel ist die Hälfte der Arbeit, die cmp hat
Wenn Sie die Möglichkeit, Ihre
__cmp__()
wir können wahrscheinlich Ihnen zeigen, wie zu konvertieren, um eine Schlüssel-FunktionWenn Sie dabei sind viele Iterationen zwischen änderungen sollten Sie den cache den Wert der sortierten Elemente.
Python nicht haben, built-in Daten-Strukturen für diese, obwohl die
bisect
- Modul bietet Funktionalität für die Beibehaltung einer sortierten Liste mit entsprechend effizienten algorithmen.Wenn Sie eine Liste der sortierten Schlüssel, können Sie es paar mit einem
collections.defaultdict(list)
zu bieten multimap-wie-Funktionalität.In seinem Buch "Programming in Python 3", Mark Summerfield stellt eine sortierte dictionary-Klasse. Der source code ist verfügbar in dieses zip-Archiv - look für SortedDict.py. Die SortedDict-Klasse ist im detail beschrieben in dem Buch (das empfehle ich sehr). Es unterstützt beliebige Schlüssel für den Vergleich und die mehrere Werte pro key (was jedes Wörterbuch in Python, so dass nicht, dass große einen deal, denke ich).