Nun ... Ich habe eine triviale Anfrage, einen Eintrag zu erstellen, der eine Liste von Einträgen während des Betriebs filtert. (Denken Sie an eine Funktion zur automatischen Vervollständigung des Editors)Wie schnell eine Liste mit Regex filtern?
Die Anforderung besteht darin, einen Regex-Filter über die gesamte Liste zu unterstützen und nur übereinstimmende Einträge anzuzeigen.
zB
Die Liste enthält:
abc.efg.hij.entry
abc.ddd.hij.entry2
hij.some.value.entry
Typing im Entry
Value : List
hij : abc.efg.hij.entry, abc.ddd.hij.entry2, hij.some.value.entry
ddd : abc.ddd.hij.entry2
dd*entry : abc.ddd.hij.entry2
val : hij.some.value.entry
Hier ist der Code i zum Filtern der Liste bin mit:
regex = re.compile(r"{0}".format(entry_value), re.IGNORECASE)
display_list = list(filter(regex.search, display_list))
Das wahre Leben li st enthält ~ 300K Einträge von Strings (bis zu jeweils 100 char) und die Leistung der oben genannten ist sehr schlecht, unter Berücksichtigung einer GUI-Antwortzeit. Ich habe meinen echten Testfall profiliert und es ergibt ~ 0.8s für jeden im Eintrag eingegebenen Schlüssel.
Gibt es einen schnelleren Weg?
Danke - ausgezeichneter Tipp - ich habe meine In-Memory-Datenbank nach sqlite3 verschoben - die Filterzeit fiel auf unter 100ms (x8-Optimierung). Von der Listbox selbst ist dies bereits optimiert (ich zeige nur einen kleinen Teil der gefilterten Liste und lasse den Benutzer durch sie blättern ...) – NirMH