87 votes

Qu'est-ce qu'une opération plus rapide, re.match/search ou str.find ?

Pour les recherches de chaînes uniques, est-il plus rapide d'utiliser simplement str.find/rfind que d'utiliser re.match/search ?

Autrement dit, pour une chaîne donnée, s, dois-je utiliser :

 if s.find('lookforme') > -1:
    do something

ou alors

 if re.match('lookforme',s):
    do something else

?

190voto

user225312 Points 22699

La question : laquelle est la plus rapide est la meilleure réponse en utilisant timeit .

 from timeit import timeit
import re

def find(string, text):
    if string.find(text) > -1:
        pass

def re_find(string, text):
    if re.match(text, string):
        pass

def best_find(string, text):
    if text in string:
       pass

print timeit("find(string, text)", "from __main__ import find; string='lookforme'; text='look'")  
print timeit("re_find(string, text)", "from __main__ import re_find; string='lookforme'; text='look'")  
print timeit("best_find(string, text)", "from __main__ import best_find; string='lookforme'; text='look'")  

La sortie est :

 0.441393852234
2.12302494049
0.251421928406

Donc, non seulement vous devez utiliser l' in parce qu'il est plus facile à lire, mais aussi parce qu'il est plus rapide.

21voto

Narann Points 97

Juste pour compléter les préoccupations de réponse les plus votées concernant le temps de compilation des expressions régulières, voici une version avec un modèle précompilé :

 from timeit import timeit
import re

def find(string, text):
    if string.find(text) > -1:
        pass

def re_find(string, text_re):
    if text_re.match(string):
        pass

def best_find(string, text):
    if text in string:
       pass

print timeit("find(string, text)", "from __main__ import find; string='lookforme'; text='look'")  
print timeit("re_find(string, text_re)", "from __main__ import re_find; string='lookforme'; import re; text_re=re.compile('look')")  
print timeit("best_find(string, text)", "from __main__ import best_find; string='lookforme'; text='look'")

Et mes chiffres :

 0.189274072647
0.239935874939
0.0820939540863

Le modèle précompilé améliore les nombres, mais malgré tout, in est le plus rapide.

19voto

Jochen Ritzel Points 42916

Utilisez ceci:

 if 'lookforme' in s:
    do something

Regex doit d'abord être compilé, ce qui ajoute une certaine surcharge. La recherche de chaîne normale de Python est de toute façon très efficace.

Si vous recherchez beaucoup le même terme ou lorsque vous faites quelque chose de plus complexe, les regex deviennent plus utiles.

7voto

Ben Points 265

re.compile accélère beaucoup les expressions régulières si vous recherchez la même chose encore et encore. Mais j'ai juste obtenu une énorme accélération en utilisant "in" pour éliminer les mauvais cas avant de matcher. Anecdotique, je sais. ~Ben

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X