Aaaaaaah d’aaccooooord......
Dans #5 tu as écrit
preg_replace('/\s+/s', "\n", $str);
Dans #8 :
sans préciser que la chaîne de remplacement est '' et non plus ’\n’
Si j’avais réfléchi 1 mn, j’aurais fini par trouver, mais enfin c’est assez piégeux et le pauvre bigs3232 risquait de tourner en rond encore une fois lui aussi.
J’ai comparé les vitesses de différents codes avec ces solutions.
D’abord des codes de détection seulement:
re.findall( '\s+' , ch ) la première RE dont il a été question
re.findall( '^\s*' , ch , re.M ) re.M est l’option m en Python
et aussi ai je pensé:
re.findall( ’^\s+’ , ch , re.M )
La regex basée sur la seconde RE est 14 % moins longue que la première. C’est sans doute parce que chercher ’^’ qui symbolise quelque chose d’unique est plus facile que chercher ’\s’ qui symbolise plusieurs caractères. Or pour l’un comme pour l’autre, le moteur de regex doit tester chaque caractère de la chaîne explorée l’un après l’autre.
La troisième regex est encore plus rapide: 40 % de temps en moins que la première. Pour le moteur de regex, chercher une position après une fin de ligne suivie obligatoirement d’un caractére matchant ’\s’ est une tâche plus étroite que chercher une telle position suivie de n’importe quel caractère. On vérifie là que plus une RE est précise, plus la recherche est rapide.
Ensuite j’ai testé des codes de recherche-substitution:
re.sub( '\s+' , ’\n’ , ch ) la première RE dont il a été question
re.sub( '^\s*' , '' , ch , re.M ) re.M est l’option m en Python
re.sub( ’^\s+’ , '' , ch , re.M )
Les temps absolus sont 15 à 20 % plus grands. C’est la détection qui prend le plus de temps, par rapport à la substitution.
Mais au niveau des temps relatifs, ça ne change rien de façon perceptible.
première : référence
2ième: - 14 % de temps
3ième: - 43 % de temps en moins
La troisiène RE ’^\s+’ est donc la mieux car elle permet de ne remplacer par '’ que les débuts de lignes remplies de blancs et autres caractères invisbles, ce qui se traduit par une plus grande rapidité.
Tandis que '^\s*' oblige à remplacer aussi par ’’ toutes les positions de longueur zéro qui se trouvent au début de toutes les lignes, opérations tout à fait inutile s'il en est....
En outre $str = preg_replace( ’^\s+’ , '', $str); correspond plus précisément à ce qui doit être fait.
Remarque:
je pense qu'avec sed , ce serait encore plus rapide
J’espère ne pas m’être trompé encore une fois.
Partager