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.
Implémenter dans l'environnement d'exécution suivant
article | valeur |
---|---|
Python Version | 3.8.2 |
OS | Ubuntu 20.04 |
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'argumentsstartswith Comparer par méthode |
compare_str | La première chaîne de chacune des chaînes d'arguments esttarget_word Comparer si égal à |
target_word | Chaîne de caractères à comparer |
match_word | target_word Préfixe de chaîne qui correspond |
not_match_word | target_word Pré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()
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.
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 |
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