Es gibt verschiedene Möglichkeiten, eine Präfixübereinstimmung für eine Zeichenfolge mit dem Namen Ptyhon zu ermitteln. Unter diesen werden die folgenden drei typischen Geschwindigkeitsvergleiche durchgeführt.
Implementieren Sie in der folgenden Ausführungsumgebung
Artikel | Wert |
---|---|
Python Version | 3.8.2 |
OS | Ubuntu 20.04 |
Überprüfen Sie den Vorgang anhand des folgenden Programms. Die Rollen jeder Variablen und jeder Funktion sind wie folgt. Ändern Sie die Variable entsprechend den Merkmalen, die Sie messen möchten.
Variable/Funktion | Erläuterung |
---|---|
time_logging | Dekorateur zur Zeitmessung |
compare_regex | Vergleichen Sie jede Liste der Argumentzeichenfolgen mit einem regulären Ausdruck |
compare_startswith | Jede der Liste der Argumentzeichenfolgenstartswith Vergleichen Sie nach Methode |
compare_str | Die erste Zeichenfolge in jeder Liste der Argumentzeichenfolgen isttarget_word Vergleichen Sie, wenn gleich |
target_word | Zu vergleichende Zeichenkette |
match_word | target_word Übereinstimmendes Zeichenfolgenpräfix |
not_match_word | target_word Nicht übereinstimmendes Zeichenfolgenpräfix |
compare_word_num | Gesamtzahl der zu vergleichenden Zeichenfolgen |
compare_func | Funktion zum Messen |
main | Aufzurufende Funktion |
import re
import time
def time_logging(func):
def deco(*args, **kwargs):
stime = time.time()
res = func(*args, **kwargs)
etime = time.time()
print(f'Finish {func.__name__}. Takes {round(etime - stime, 3)}s.', flush=True)
return res
return deco
@time_logging
def compare_regex(compare_words):
pattern = re.compile(f'^{target_word}')
for word in compare_words:
if pattern.match(word):
pass
@time_logging
def compare_startswith(compare_words):
for word in compare_words:
if word.startswith(target_word):
pass
@time_logging
def compare_str(compare_words):
length = len(target_word)
for word in compare_words:
if word[:length] == target_word:
pass
target_word = f'foo'
match_word = f'{target_word}'
not_match_word = f'bar'
compare_word_num = 100_000_000
match_rate = 50
compare_func = compare_regex
def main():
compare_words = []
for index in range(compare_word_num):
if index % 100 <= match_rate:
compare_words.append(f'{match_word}_{index}')
else:
compare_words.append(f'{not_match_word}_{index}')
compare_func(compare_words)
if __name__ == '__main__':
main()
Weil sich die Tendenz zur Ausführungsgeschwindigkeit abhängig von der Länge der zu vergleichenden Zeichenfolge ändern kann Messen Sie die Ausführungsgeschwindigkeit von "compare_regex", "compare_startswith" und "compare_str", wenn "target_word" auf 5, 10, 50, 100 bzw. 500 Zeichen geändert wird.
Einheit (Sekunden)
Funktion\Wortzahl | 5 | 10 | 50 | 100 | 500 |
---|---|---|---|---|---|
compare_regex | 11.617 | 12.044 | 16.126 | 18.837 | 66.463 |
compare_startswith | 6.647 | 6.401 | 6.241 | 6.297 | 6.931 |
compare_str | 5.941 | 5.993 | 4.87 | 5.449 | 8.875 |
In Bezug auf die Geschwindigkeit sollte es mit "beginnt mit" oder "str [: word_length]" für eine beliebige Anzahl von Zeichen implementiert werden. Am meisten empfohlen wird "beginnt mit", was am wenigsten von der zu vergleichenden Zeichenfolge betroffen ist. Mir gefällt es auch am besten in Bezug auf die Lesbarkeit.