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

Tkinter Python Discussion :

Optimiser la vitesse d'application de tags sur un Text


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut Optimiser la vitesse d'application de tags sur un Text
    Bonjour j'ai une classe dérivée d'un ScrolledText.

    Elle possède la méthode suivante qui me sert à appliquer une couleur différente à chaque lettre (a, t, g ou c) contenue dans mon ScrolledText :

    Code : 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
        def color_seq(self):
            self.tag_configure("a-color", foreground ="green")
            self.tag_configure("t-color", foreground ="red")
            self.tag_configure("g-color", foreground ="black")
            self.tag_configure("c-color", foreground ="blue")
            contenu_du texte = self.get("1.0", "1.0 lineend")
            for i in range (len(contenu)):
                j = contenu[i].lower()
                if j == "a":
                    self.tag_add("a-color", "1.%d" %i)
                elif j == "t":
                    self.tag_add("t-color", "1.%d" %i)
                elif j == "g":
                    self.tag_add("g-color", "1.%d" %i)
                elif j == "c":
                    self.tag_add("c-color", "1.%d" %i)
    Mon problème est que pour de gros fichiers textes, c'est long!!!! 2 à 3 secondes.
    J'ai essayé d'optimiser en faisant des listes des positions pour chaque lettre et d'appliquer le tag après, mais je n'ai pas gagné en performances. Je suppose que ma fonction est de la très mauvaise programmation alors je vous demande votre aide. Comment puis je faire pour améliorer cela?

    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 85
    Par défaut
    Tu as essayé avec des listes ?
    couleur = (rouge, bleu, jaune)

  3. #3
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Mon problème est que pour de gros fichiers textes, c'est long!!!! 2 à 3 secondes.
    Je crois bien que c'est pareil pour tout le monde... mais ton code n'a pas l'air particulièrement lourd... tu peux peut-être utiliser xrange(len(contenu)) à la place range(len(contenu)), à ce qu'il parait plus économe en mémoire et plus rapide qu'un range, mais la différence risque d'être minime, je dirais même presque invisible...

    Sinon, tu peux utiliser une boucle while à la place d'une for:
    Code : 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
    def color_seq(self):
            self.tag_configure("a-color", foreground ="green")
            self.tag_configure("t-color", foreground ="red")
            self.tag_configure("g-color", foreground ="black")
            self.tag_configure("c-color", foreground ="blue")
            contenu_du texte = self.get("1.0", "1.0 lineend")
            i=0
            while 1:
                j = contenu[i].lower()
                if j == "a":
                    self.tag_add("a-color", "1.%d" %i)
                elif j == "t":
                    self.tag_add("t-color", "1.%d" %i)
                elif j == "g":
                    self.tag_add("g-color", "1.%d" %i)
                elif j == "c":
                    self.tag_add("c-color", "1.%d" %i)
                i+=1
                if i==len(contenu): break
    Mais c'est toujours pareil, le gain de temps réaliser devrait être quasi-invisible, mais je pense plus grand qu'avec une boucle for avec un range() de grande taille...

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    Merci pour les réponses. Donc je suppose qu'il faut que je m'accommode de mes 2 à 3 secondes pour la mise en couleur...

  5. #5
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Il y a peut-être quelques optimisations (ca devrait te faire gagner quelques centaines de ms)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        def color_seq(self):
            self.tag_configure("a-color", foreground ="green")
            self.tag_configure("t-color", foreground ="red")
            self.tag_configure("g-color", foreground ="black")
            self.tag_configure("c-color", foreground ="blue")
            contenu_du texte = self.get("1.0", "1.0 lineend")
            stag_add = self.tag_add ## gain de quelques ms si le nombre d'éléments dans la boucle for est grand
            for j, i in zip(contenu, range (len(contenu)): ## pas dit que t'y gagnes
                stag_add(j.lower() + "-color", "1.%d" %i)
    ## ou voir si c'est plus rapide
            for i in range (len(contenu)):
                stag_add(contenu[i].lower() + "-color", "1.%d" %i)

  6. #6
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Tiens, ce que Guigui a dit m'a donné une idée; mais je sias pas trop ce qu'elle vaut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def color_seq(self):
            self.tag_configure("a-color", foreground ="green")
            self.tag_configure("t-color", foreground ="red")
            self.tag_configure("g-color", foreground ="black")
            self.tag_configure("c-color", foreground ="blue")
            contenu_du texte = self.get("1.0", "1.0 lineend")
            stag_add = self.tag_add ## gain de quelques ms si le nombre d'éléments dans la boucle for est grand
            i=0
            while i!= len(contenu):
                    j=contenu[i]
                    if j in ('a','A','t','T','g','G','c','C'): stag_add(j.lower() + "-color", "1.%d" %i)
                    i+=1
    Je sais juste que ça limite l'utilisation de lower()

Discussions similaires

  1. comment optimiser la vitesse de chargement d'un site qui est sur un CD-rom ?
    Par clavier12AZQSWX dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 05/10/2009, 00h53
  2. [VS.NET] Application asp1.1 sur IIS 5.1
    Par Estoril dans le forum Visual Studio
    Réponses: 8
    Dernier message: 02/05/2004, 17h10
  3. application qui connecte sur une page web
    Par spoolz dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 14/04/2004, 09h47
  4. Réponses: 7
    Dernier message: 17/07/2003, 11h00
  5. Réponses: 0
    Dernier message: 10/12/2000, 12h00

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