Effiziente Datenstruktur von Objekten in Python zum Nachschlagen basierend auf einer beliebigen Objektelementvariablen

8

Ich muss Objekte speichern, die eine Zahl (& gt; 2) von Integer-Elementvariablen haben, und schnelle Suchvorgänge unter Verwendung beliebiger Elementvariablen als Suchschlüssel durchführen.

Zur einfacheren Darstellung sagen wir, die Objekte sind Tupel von 3 ganzen Zahlen und ich muss schnelle Suchvorgänge mit jedem Element eines Tupels als Schlüssel in einer Liste solcher Tupel durchführen:

%Vor%

Look-ups wären wie folgt:

%Vor%

Ich brauche die Lookups um schnell / effizient zu sein. Meine beste Wette ist bisher, eine sqlite Datenbank im Speicher mit drei Spalten für die drei Tupel-Elemente zu verwenden und Indizes auf alle drei Spalten zu setzen.

Eine Suchbaum würde auch tun, aber diese haben einen Schlüssel für die Suche und ich sehe nicht, wie ich Lookups basierend auf mehr als einem Schlüssel tun könnte. Wie würdest du es tun?

    
kadam 22.05.2011, 23:35
quelle

3 Antworten

0

Verwenden von numpy:

%Vor%     
riza 23.05.2011, 02:12
quelle
6

Dies ist eine einfache Lösung. Sie könnten dies leicht in eine Klasse stellen und eine bessere Schnittstelle bereitstellen.

%Vor%

Aktualisieren :

Für das, was es wert ist, ist das obige viel schneller als die numpy Lösung zum Nachschlagen:

%Vor%

Ausgabe:

%Vor%     
senderle 23.05.2011 00:12
quelle
4

senderle ist richtig (ich upvoted), aber ich möchte (und mehr als nur in einem Kommentar) zu erarbeiten.

Dictionary-Lookups sind O (1) und sehr schnell (im Grunde wird Ihr Schlüssel in einen Hash umgewandelt, der einen bestimmten Ort im Speicher anspricht, um Ihre Daten sofort abzurufen).

Im Gegensatz dazu ist die Suche nach einem Wert bei der Suche durch ein Array langsam mindestens O (N), so dass es bei größeren Arrays länger dauert, den richtigen Wert zu finden. (Z. B. müssen Sie alle N Tasten durchgehen, die richtige finden und dann das Tupel zurückgeben.)

Wenn also Ihre Schlüssel so eindeutig sind, wie Sie sagen, ist es sinnvoll, einfach ein großes Wörterbuch zu erstellen, das auf der Basis jedes Schlüssels indexiert wird, den Sie zum Nachschlagen verwenden können. Zugegeben, Sie müssen jedes Tupel von m Elementen (m = 3 in Ihrem Fall) m mal im Wörterbuch darstellen, während es bei einem einzelnen Array nur einmal im Array dargestellt werden musste.

Sie möchten also eine Collection-Klasse definieren

%Vor%

Das interne c.collection_dict ist:

%Vor%

Und Ihre Lookups funktionieren so, wie Sie es gewünscht haben

%Vor%     
dr jimbob 23.05.2011 15:03
quelle

Tags und Links