J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)

Il y a eu un cas où j'ai dû faire beaucoup de traitement de texte dans mon entreprise, alors je l'ai fait avec Ruby, mais c'est vraiment lent ... Il y a de la place pour le réglage en termes de code, mais comme ce n'est pas une histoire si vous utilisez un gars lent, j'ai décidé de mesurer la différence de vitesse dans la LL principale.

Tout d'abord, le résultat de la mesure

Pour un petit texte (6 Mo), c'était une victoire Perl, et pour un gros texte, c'était une victoire Python. Dans chaque cas, Ruby s'échappe du fond par une petite marge, mais il est tard. Cela contraste avec Perl et Python, où leurs forces et leurs faiblesses sont largement divisées.

???_2.png

Au fait, les conditions de mesure

Présentation des joueurs participants

D'abord des joueurs Ruby

show_ruby_version


$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.3.0]

Le code à utiliser est le suivant

regex_test.rb


#!/usr/bin/env ruby

re_addr = /((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/

fh2 = open("./result_rb.txt", "w")
open("./access.log.1") { |fh|
  while line = fh.gets
    if m = re_addr.match(line)
      fh2.puts m[1]
    end
  end
}
fh2.close

Joueur Python suivant

show_python_version


$ python --version
Python 2.7.2

Le code à utiliser est le suivant

regex_test.py


#!/usr/bin/env python

import re
re_addr = re.compile("((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))")

fh2 = open('./result_py.txt', 'w')
fh = open('./access.log.1')
for line in fh.readlines():
    m = re_addr.search(line)
    if m is not None:
        fh2.write(m.group(1))
        fh2.write("\n")
fh.close()
fh2.close()

Enfin, un grand joueur Perl vétéran

show_perl_version


$ perl -v

This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-thread-multi-2level
#(Comme il est long, il est omis ci-dessous)

Le code à utiliser est le suivant

regex_test.pl


#!/usr/bin/env perl

open(FH2, ">", "./result_pl.txt");
open(FH, "<", "./access.log.1");
while($line = readline FH) {
  if ($line =~ /((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/) {
    print FH2 $1."\n";
  }
}
close(FH);
close(FH2);

Comme ça, la logique est presque la même dans chaque langue, et ça ne fait pas grand-chose.

Épilogue

Puisqu'il s'agit d'une expression régulière + écriture de fichier, ce n'est pas une comparaison de la capacité d'expression régulière pure. Cependant, pardonnez-moi car la raison de ce benchmark est le traitement d'une grande quantité de texte (extraire des données spécifiques avec une expression régulière et les écrire dans un fichier).

Puisque nous n'avons pas correctement considéré la libération de mémoire de chaque langue, le résultat peut changer à nouveau si nous le faisons correctement. Veuillez l'utiliser comme référence uniquement.

Recommended Posts

J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
J'ai comparé la vitesse de la référence du python dans la liste et la référence de l'inclusion du dictionnaire faite à partir de la liste dans.
J'ai remplacé le calcul numérique de Python par Rust et comparé la vitesse
J'ai comparé la vitesse de l'écho du framework web en langage go et du flask du framework web python
Chevauchement d'expressions régulières en Python et Java
J'ai comparé le temps de calcul de la moyenne mobile écrite en Python
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
Comment écrire le bon shebang dans les scripts Perl, Python et Ruby
J'ai essayé de résoudre 100 traitements linguistiques Knock version 2020 [Chapitre 3: Expressions régulières 25-29]
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
Spécification de la plage des tableaux ruby et python
Comparez la vitesse d'ajout et de carte Python
Essayez Progate Free Edition [Python I]
J'ai essayé de résoudre la version 2020 de 100 problèmes de traitement du langage [Chapitre 3: Expressions régulières 20 à 24]
Divise la chaîne de caractères par le nombre de caractères spécifié. En Ruby et Python.
"Régression linéaire" et "Version probabiliste de la régression linéaire" en Python "Régression linéaire de Bayes"
Différence entre Ruby et Python en termes de variables
J'ai vérifié les versions de Blender et Python
Gestion des versions de Node, Ruby et Python avec anyenv
J'ai vérifié la vitesse de référence lors de l'utilisation de la liste python, du dictionnaire et du type de jeu.
J'ai comparé Java et Python!
À propos de Python et des expressions régulières
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Débarrassez-vous des données sales avec Python et les expressions régulières
J'ai essayé de programmer le test du chi carré en Python et Java.
Je veux connaître la nature de Python et pip
[Astuces] Problèmes et solutions dans le développement de python + kivy
J'ai implémenté N-Queen dans différentes langues et mesuré la vitesse
L'histoire de Python et l'histoire de NaN
Je ne me souviens pas des expressions régulières Python
pyenv-changer la version python de virtualenv
J'ai personnellement comparé Java et Ruby
J'ai écrit la file d'attente en Python
Lors de l'utilisation d'expressions régulières en Python
J'ai écrit la pile en Python
Comptez bien le nombre de caractères thaïlandais et arabes en Python
Expressions régulières faciles et solides à apprendre en Python
[Python] J'ai expliqué en détail la théorie et la mise en œuvre de la régression logistique
J'ai écrit le code pour écrire le code Brainf * ck en python
[Python] J'ai expliqué en détail la théorie et la mise en œuvre de l'arbre de décision
J'ai comparé Node.js et Python lors de la création d'une miniature à l'aide d'AWS Lambda
Obtenez le titre et la date de livraison de Yahoo! News en Python
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
J'ai comparé argparse standard python3 et python-fire
Vérifiez le comportement du destroyer en Python
Différences entre Ruby et Python dans la portée
différence entre les instructions (instructions) et les expressions (expressions) en Python
[Python] Doux Est-ce doux? À propos des suites et des expressions dans les documents officiels
À propos de l'environnement virtuel de Python version 3.7
Comparer la grammaire de base de Python et Go d'une manière facile à comprendre
Changer la saturation et la clarté des spécifications de couleur comme # ff000 dans python 2.5
Je ne connaissais pas les bases de Python
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
Le résultat de l'installation de python sur Anaconda
Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
[Python] Essayez pydash de la version Python de lodash