20 votes

Python re.split() vs split()

Dans mes quêtes d'optimisation, j'ai découvert que la méthode split() intégrée est environ 40% plus rapide que l'équivalent re.split().

Un benchmark fictif (facilement copiable) :

import re, time, random 

def random_string(_len):
    letters = "ABC"
    return "".join([letters[random.randint(0,len(letters)-1)] for i in range(_len) ])

r = random_string(2000000)
pattern = re.compile(r"A")

start = time.time()
pattern.split(r)
print "with re.split : ", time.time() - start

start = time.time()
r.split("A")
print "with built-in split : ", time.time() - start

Pourquoi cette différence ?

25voto

NullUserException Points 42268

re.split es attendu est plus lent, car l'utilisation d'expressions régulières entraîne une certaine surcharge.

Bien sûr, si vous vous séparez sur un constant il est inutile d'utiliser la chaîne re.split() .

10voto

the wolf Points 10164

En cas de doute, vérifier le code source . Vous pouvez voir que Python s.split() est optimisé pour les espaces blancs et mis en ligne. Mais s.split() ne concerne que les délimiteurs fixes.

Pour le compromis sur la vitesse, une re.split La division basée sur les expressions régulières est beaucoup plus flexible.

>>> re.split(':+',"One:two::t h r e e:::fourth field")
['One', 'two', 't h r e e', 'fourth field']
>>> "One:two::t h r e e:::fourth field".split(':')
['One', 'two', '', 't h r e e', '', '', 'fourth field']
# would require an addition step to find the empty fields...
>>> re.split('[:\d]+',"One:two:2:t h r e e:3::fourth field")
['One', 'two', 't h r e e', 'fourth field']
# try that without a regex split in an understandable way...

Ce re.split() es sólo 29 % plus lent (ou que s.split() est seulement 40% plus rapide) est ce qui devrait être étonnant.

4voto

Dov Grobgeld Points 1673

L'exécution d'une expression régulière signifie que vous exécutez une machine à états pour chaque caractère. Effectuer un split avec une chaîne constante signifie que vous recherchez simplement la chaîne. La seconde est une procédure beaucoup moins compliquée.

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