Python Geschwindigkeitsvergleich Regex vs Startwith vs Str [: word_length]

Python Geschwindigkeitsvergleich Regex vs Startwith vs Str [: num]

Einführung

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.

Messmethode

Umgebung

Implementieren Sie in der folgenden Ausführungsumgebung

Artikel Wert
Python Version 3.8.2
OS Ubuntu 20.04

Programm

Ü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 ArgumentzeichenfolgenstartswithVergleichen Sie nach Methode
compare_str Die erste Zeichenfolge in jeder Liste der Argumentzeichenfolgen isttarget_wordVergleichen Sie, wenn gleich
target_word Zu vergleichende Zeichenkette
match_word target_wordÜbereinstimmendes Zeichenfolgenpräfix
not_match_word target_wordNicht ü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()

Parameter

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.

Messung

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

chart.png

Erwägung

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.

Recommended Posts

Python Geschwindigkeitsvergleich Regex vs Startwith vs Str [: word_length]
Geschwindigkeitsvergleich von Python, Java, C ++
Geschwindigkeitsvergleich der Python-XML-Perspektive
Vergleich von Python Serverless Frameworks-Zappa mit Chalice
[Python3] Geschwindigkeitsvergleich usw. über den Entzug von numpy.ndarray
Erster Python 3 ~ Erster Vergleich ~
Mein str (Python)
Experiment zum Vergleich der Schreibgeschwindigkeit von Dateien zwischen Python 2.7.9 und Pypy 2.5.0
[Ruby vs Python] Benchmark-Vergleich zwischen Rails und Flask