Hallo!
ich habe eine Liste von dicts [{a:1,...},{a:2,...},...] und möchte da performant suchen. Zum Beispiel
find(a=2) ohne alles linear zu durchsuchen. Teilweise kann ich die zu indizierenden Felder vorher erraten (kann also komplexe Indexe aufbauen und pflegen) und teilweise sollten Indexe nur temporär, einmalig erstellt werden. Unter Umständen brauche ich sogar das ganze Äquivalent eines SQL joins gegen eine andere Liste.
Gibt es da Bibliotheken die mir da weiterhelfen? Welche Methoden würdet ihr für die drei Fälle vorschlagen?
Indexing über Datenfelder
@Gerenuk: Einen Index temporär für eine Abfrage aufzubauen macht keinen Sinn -- da ist linear suchen einfacher und schneller. Wenn Du tatsächlich DB-Operationen benötigst, dann solltest Du vielleicht auch tatsächlich eine DB verwenden. SQLite bietet sich da an. Da brauchst Du nicht einmal eine Datei, denn man kann auch "in-memory" Datenbanken anlegen.
Ein Einmal-Index würde vielleicht doch Sinn machen, wenn ich viele Abfragen über eine sich nicht ändernde Datenmenge habe. Schon sowas wie ein SQL Join. Gut, beim Join gibt es ja wiederrum Sort-Join. Keine Ahnung was besser ist.
Und auf jeden Fall liegen die Daten als Python Klassen vor. Ich könnte sie zwar jedesmal in SQLite laden und dann SQL Operationen nutzen, aber danach müssten die Daten gleich wieder in Python Klassen. Fragt sich, ob das hin und her schnell genug ist.
Und auf jeden Fall liegen die Daten als Python Klassen vor. Ich könnte sie zwar jedesmal in SQLite laden und dann SQL Operationen nutzen, aber danach müssten die Daten gleich wieder in Python Klassen. Fragt sich, ob das hin und her schnell genug ist.
Es geht um etwa 500000 Objekte. Meine bisherigen Methoden laufen eigentlich auch schon ohne Optimierung recht gut (3sec für eine Suche über Verlinkte Objekte und 3 Ebenen; die Objekte sind nämlich verlinkt). Aber eine flexible Indexinglösung könnte nochmal einen Faktor an Geschwindigkeit bringen. Im einfachsten Fall mache ich dicts als Indexe, aber vielleicht gibt es ja vorgefertigte Indexing Lösungen für noch cleverere Anwendungen. Insbesonde sollen die drei genannten Fälle abgedeckt werden.