schnellste Möglichkeit, Strings in Python zu vergleichen

8

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.

    
Mike Trpcic 13.01.2010, 02:11
quelle

10 Antworten

16

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%     
Ned Batchelder 13.01.2010, 02:21
quelle
5

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.

    
John Machin 13.01.2010 02:27
quelle
3

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%     
gahooa 13.01.2010 02:47
quelle
2

Sie können startswith

verwenden

zB

%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%     
ghostdog74 13.01.2010 02:17
quelle
2

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     
Michael Anderson 13.01.2010 02:30
quelle
1

jaro_winkler() in python-Levenshtein könnte das sein, wonach Sie suchen.

>     
Ignacio Vazquez-Abrams 13.01.2010 02:26
quelle
0

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%     
Peter Hansen 13.01.2010 02:37
quelle
0

Wenn ich Ihr Q richtig verstehe, möchten Sie ein Snippet, das die Antwort zurückgibt, sobald sie es hat, ohne weiter durch Ihre 'Befehlsliste' zu gehen. Dies sollte tun, was Sie wollen:

%Vor%     
doug 13.01.2010 02:38
quelle
0

Ersetzen Sie sie durch Ihre bevorzugte String-Vergleichsfunktion. Ziemlich schnell und auf den Punkt.

%Vor%     
Bear 13.01.2010 02:28
quelle
0
%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.

    
SpliFF 13.01.2010 02:59
quelle

Tags und Links