Ich schreibe in Python ein Skript, mit dem der Benutzer eine Zeichenfolge eingeben kann. Dies ist ein Befehl, der das Skript anweist, eine bestimmte Aktion auszuführen. Um zu argumentieren, sage ich meine Befehlsliste ist:
%Vor%Nun möchte ich, dass der Benutzer das Wort "log" eingeben kann, und es wird eine bestimmte Aktion ausführen, was sehr einfach ist. Ich möchte jedoch Teilwörter zuordnen. Wenn ein Benutzer beispielsweise "lo" eingibt, sollte er "lock" entsprechen, da er in der Liste höher ist. Ich habe versucht, strncmp aus libc mit ctypes, um dies zu erreichen, aber noch Kopf oder Zahl davon zu machen.
Wenn Sie eine Eingabe von einem Benutzer akzeptieren, warum machen Sie sich dann Sorgen über die Geschwindigkeit des Vergleichs? Selbst die langsamste Technik wird viel schneller sein, als der Benutzer wahrnehmen kann. Verwenden Sie den einfachsten verständlichen Code, den Sie können, und lassen Sie Effizienzprobleme für enge innere Schleifen offen.
%Vor%Dies wird tun, was Sie wollen:
%Vor%Allerdings:
Du scheinst über die falsche Sache geborgen zu sein. Also 50 Benutzer bedeuten 50 Millisekunden - Sie werden nicht wegen dieser Art von "Verspätung" aus der Stadt laufen. Machen Sie sich Sorgen über ineffiziente Datenbankzugriffe oder Probleme, die dadurch entstehen, dass Benutzer "r" eingeben und "gelesen" werden, wenn sie denken, dass sie eine "Anfrage" erhalten. Die Minimierung von Benutzeranschlägen auf die Gefahr von Fehlern ist so 1960s, dass es nicht lustig ist. Was benutzen sie? ASR33 Fernschreiber? Zumindest könnten Sie auf eine eindeutige Übereinstimmung bestehen - "rea" für read und "req" für request.
Dies wird zur Laufzeit wie gewünscht optimiert ... (obwohl höchstwahrscheinlich nicht benötigt)
Hier ist ein einfaches Code-Bit, das ein Eingabewörterbuch des auf die Funktion abgebildeten Befehls übernimmt und zu einem Ausgabewörterbuch aller nicht-duplizierten Unterbefehle führt, die auf dieselbe Funktion abgebildet sind.
Sie starten das also, wenn Sie Ihren Dienst starten, und Sie haben dann 100% optimierte Suchvorgänge. Ich bin mir sicher, dass es einen clevereren Weg gibt, dies zu tun, also können Sie es bearbeiten.
%Vor%Sie können startswith
verwendenzB
%Vor%oder wenn Sie "lo" in dem Wort unabhängig von der Position finden möchten, verwenden Sie einfach den "in" -Operator
%Vor%daher, eine Möglichkeit, wie Sie dies tun können:
%Vor%Ich schlage vor, dass Sie die readline-Python-Bibliothek verwenden, anstatt das Rad neu zu erfinden. Der Benutzer muss auf Tab drücken, um das Wort zu vervollständigen, aber Sie können readline up einstellen, so dass die Registerkarte so weit wie möglich übereinstimmt oder zyklisch durch alle Wörter läuft, die mit dem aktuellen Stub beginnen.
Dies scheint eine ziemlich anständige Einführung in readline in Python Ссылка
zu sein jaro_winkler()
in python-Levenshtein könnte das sein, wonach Sie suchen.
Dies ist eine Adaption von J.Tauber's Trie-Implementierung in Python , die Sie vergleichen und / oder passen Sie sich mit den zusätzlichen Funktionen an, die Sie benötigen. Siehe auch den Wikipedia-Eintrag bei Versuchen .
%Vor%Setup (Reihenfolge der Zugabe ist wichtig!):
%Vor%Dann ruf so an:
%Vor%Im Grunde genommen fragen Sie nach meinem Kommentar, wie Sie eine Operation optimieren können, die keine messbare Zeit oder CPU benötigt. Ich habe hier 10.000 Befehle verwendet und die Testzeichenkette stimmt mit jeder überein, nur um zu zeigen, dass selbst unter extremen Umständen immer noch Hunderte von Benutzern dies tun können und sie niemals eine Verzögerung sehen würden.