Comparaison de vitesse Python regex vs startswith vs str [: word_length]

Comparaison de vitesse Python regex vs startswith vs str [: num]

introduction

Il existe plusieurs façons de déterminer une correspondance de préfixe pour une chaîne qui est Ptyhon. Parmi eux, les trois comparaisons de vitesse typiques suivantes sont effectuées.

Méthode de mesure

environnement

Implémenter dans l'environnement d'exécution suivant

article valeur
Python Version 3.8.2
OS Ubuntu 20.04

programme

Vérifiez le fonctionnement en fonction du programme suivant. Les rôles de chaque variable et de chaque fonction sont les suivants. Modifiez la variable en fonction des caractéristiques que vous souhaitez mesurer.

variable/une fonction La description
time_logging Décorateur pour mesurer le temps
compare_regex Comparez chacune des chaînes d'arguments avec une expression régulière
compare_startswith Chacune de la liste des chaînes d'argumentsstartswithComparer par méthode
compare_str La première chaîne de chacune des chaînes d'arguments esttarget_wordComparer si égal à
target_word Chaîne de caractères à comparer
match_word target_wordPréfixe de chaîne qui correspond
not_match_word target_wordPréfixe de chaîne qui ne correspond pas
compare_word_num Nombre total de chaînes à comparer
compare_func Fonction à mesurer
main Fonction à appeler
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()

Paramètres

Parce que la tendance de la vitesse d'exécution peut changer en fonction de la longueur de la chaîne de caractères à comparer Mesurez la vitesse d'exécution de compare_regex, compare_startswith et compare_str lorsque target_word est changé en 5, 10, 50, 100 et 500 caractères, respectivement.

La mesure

Unité (secondes)

une fonction\nombre de mots 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

Considération

En termes de vitesse, il devrait être implémenté avec commence par oustr [: word_length]pour n'importe quel nombre de caractères. Le plus recommandé est «commence par», qui est le moins affecté par la chaîne de caractères à comparer. Je l'aime aussi le plus en termes de lisibilité.

Recommended Posts

Comparaison de vitesse Python regex vs startswith vs str [: word_length]
Comparaison de vitesse de Python, Java, C ++
Comparaison de la vitesse de la perspective XML Python
Comparaison des frameworks sans serveur Python-Zappa vs Chalice
[Python3] Comparaison de vitesse, etc. sur la privation de numpy.ndarray
Premier Python 3 ~ Première comparaison ~
Mon str (Python)
Expérience de comparaison de la vitesse d'écriture de fichier entre python 2.7.9 et pypy 2.5.0
[Ruby vs Python] Comparaison de référence entre Rails et Flask