IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

re.compile() pourquoi compiler une regex


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut re.compile() pourquoi compiler une regex
    Bonjour,

    je voudrais gérer les commentaires de fichiers .ogg en utilisant python-mutagen.

    j'en arrive à vouloir récupérer des données avec des regex, mais je ne comprends pas le bénéfice de re.compile().
    ça transforme un motif en objet, qui dispose de méthodes que l'on peut utiliser sans compiler la regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> import re
    >>>
    >>> mx = "Musiques/monBeauMorceau_2022-11-30_001.ogg"
    >>> motif = r"(\d{4}(-\d{2}){2})"
    >>>
    >>> re.search(motif,mx).group(1)
    '2022-11-30'
    >>>
    >>> comp = re.compile(motif)
    >>> comp.search(mx).group(1)
    '2022-11-30'
    >>>
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Si on "compile", c'est pour aller plus vite lors de recherches répétitives en utilisant une regex "compilée". Comme le module "cache" la forme compilée des dernières regex utilisées, ça n'aide pas toujours à aller plus vite.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 219
    Par défaut
    Hello,
    la compilation est intéressante au point de vue performance lorsque l'on utilise plusieurs fois le même motif dans la même portion de code (ex : dans une boucle).
    Ami calmant, J.P

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    la compilation est intéressante au point de vue performance lorsque l'on utilise plusieurs fois le même motif dans la même portion de code (ex : dans une boucle).
    non parce que dans ce cas, on va récupérer la mouture compilée dans le cache LRU implémenté par le module.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 219
    Par défaut
    avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import re
    import time
    SIZE = 100_000_000
     
    start = time.time()
    foo = re.compile('foo')
    [foo.search('bar') for _ in range(SIZE)]
    print('compiled:  ', time.time() - start)
    start = time.time()
    [re.search('foo', 'bar') for _ in range(SIZE)]
    print('uncompiled:', time.time() - start)

    on obtient le résultat suivant :
    compiled: 14.647532224655151
    uncompiled: 61.483458042144775

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    on obtient le résultat suivant :
    compiled: 14.647532224655151
    uncompiled: 61.483458042144775
    Ce qui montre des microsecondes de différence pour des centaines de milliers d'itérations et mesure le temps d'aller récupérer la forme compilée dans le cache. Ce qui est quasi nul.

    Dans un "vrai" programme, on va sans doute avoir plusieurs expressions régulières et utiliser un dictionnaire pour les stocker histoire de ne pas se trimbaler des chaines de caractères à différents endroits. Comme ces codes là vont coexister avec d'autres codes qui ont eux aussi des expressions régulières, on ne sait pas trop si ses expressions régulières seront toujours dans le cache lorsqu'on voudra les réutiliser.

    Se posera alors la question de mettre dans ce dictionnaire la forme compilée ou pas... et, dans la pratique, on aura un overhead similaire au cache LRU qui vient avec le module.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par N_BaH Voir le message
    je voudrais gérer les commentaires de fichiers .ogg en utilisant python-mutagen.
    Et tu n'as pas eu l'idée de le faire en bash???

    Citation Envoyé par jurassic pork Voir le message
    avec ce code ...on obtient le résultat suivant :
    J'ai essayé de mon côté de voir comment compile() pourrait aider...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #!/usr/bin/env python3
    # coding: utf-8
     
    import random
    import timeit
    from functools import partial
    import re
     
    # Initialisation random
    random.seed()
     
    # Les fonctions à tester
    def direct(s, data):
    	return tuple(re.search(s, d) for d in data)
     
    def compiz(s, data):
    	s=re.compile(s)
    	return tuple(re.search(s, d) for d in data)
     
    fct={
        "direct" : direct,
        "compile" : compiz,
    }
     
    # Les données à traiter
    data=["30/12/2022",] * 2000
    find="[0-9]{4}"
     
    # Vérification fonctions identiques
    assert len(set(repr(f(find, data)) for f in fct.values())) == 1
     
    # Le nombre de répétitions (les moyennes se feront sur cette valeur)
    repeat=20
     
    # Appel des fonctions dans un ordre aléatoire et affichage du chrono
    print("start=%d, repeat=%d" % (len(data), repeat))
    for (k, v) in random.sample(tuple(fct.items()), len(fct)):
        t=timeit.Timer(partial(v, find, data)).repeat(repeat=repeat, number=100)
        print("%s: min=%f, max=%f, avg=%f" % (k, min(t), max(t), sum(t)/len(t)))
    # for

    Mais j'obtiens...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    start=2000, repeat=20
    direct: min=0.833570, max=0.906373, avg=0.852353
    compile: min=1.383366, max=1.553580, avg=1.436318
    ... ce qui n'est pas non plus vraiment convainquant.

    Compile() sert à sauvegarder l'expression pour la réutiliser (ce qui me convainc pas trop non plus vu que la string originelle est parfaitement sauvegardable et récupérable)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Compiler une regex
    Par blacksnake dans le forum Langage
    Réponses: 6
    Dernier message: 05/08/2007, 18h08
  2. [TomCat] - Compiler une Servlet avec Eclipse
    Par spidetra dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 07/12/2005, 15h26
  3. [VB] COmment compiler une dll dans un exe (zlib.dll)
    Par Khrysby dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/11/2005, 12h10
  4. [Applet] Compiler une applet ?
    Par Bobsinglar dans le forum Applets
    Réponses: 6
    Dernier message: 30/06/2005, 18h06
  5. [Debutant(e)]Compiler une classe
    Par tscoops dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 27/05/2004, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo