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

Calcul scientifique Python Discussion :

[Numarray]Lenteur! Trop de boucle For peut etre????


Sujet :

Calcul scientifique Python

  1. #1
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut [Numarray]Lenteur! Trop de boucle For peut etre????
    Salut a toutes et tous!

    Voila je viens de programmer le seuillage entropique a l'aide de nummarray.

    Le Souci le temps de calcul! Je soupsonne le fait de trop utiliser de boucle for pour créer, ou modifier des matrices...Je vous met du code.!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for i in range(larg):
            for j in range(haut):
                if P[i][j]==0:
                    pass
                else:
                    Plog[i][j]=M.log10(P[i][j])
     
     
        entropie=-1*sum((P*Plog).flat)
    Est ce que vous pensez que la lenteur peut venir de ca. Cette boucle est appelé 255^3 .. a oui quand meme!!!

    De plus l'appel de la fonction ou apparait ce code est lui meme dans une boucle 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
    for i in range(1,254):
            Blanc=255*Im.threshhold(image,high=i)
            Inv=255*Im.threshhold(Noir,high=i)
     
     
            entroN=entropie(Inv)
            entroB=entropie(Blanc)
     
            Com.append(abs(entroN-entroB))
     
     
     
        for m in range(len(Com)):
     
            if Com[m]==max(Com):pos=m
     
        print pos
    Voila je trouve que ca fait beaucoup de boucle for.... Alors si vous avez des solutions de sinthaxe, ou si vous reperez des erreurs gourmandes en memoires faites moi signe S'il vous plait.

    MERCI Beaucoup!

  2. #2
    Expert éminent sénior
    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
    Points : 10 067
    Points
    10 067
    Par défaut
    Pour accélérer la chose, c'est tout simple:

    il faut remplacer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for i in range(larg):
            for j in range(haut):
                if P[i][j]==0:
                    pass
                else:
                    Plog[i][j]=M.log10(P[i][j])
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Pflat = P.flat ## (je suppose que P est un tableau numarray
    PlogFlat = Plog.flat ## itou
    for i in range(len(Pflat)):
        if Pflat[i] !=0:  Plogflat[i] = M.log10(Pflat)
    Et n'oublie pas pour mesurer des temps de rajouter des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import time ## au début
    tempi = time.clock() ## aux endroits ou tu veux avoir un temps de référence
    (comme ici: http://python.developpez.com/faq/?pa...tenuRepertoire )

  3. #3
    Expert éminent sénior
    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
    Points : 10 067
    Points
    10 067
    Par défaut
    On peut même encore accélérer un peu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Pflat = P.flat ## (je suppose que P est un tableau numarray
    PlogFlat = Plog.flat ## itou
    Mlog10 = M.log10 ## s'a évite qu'à chaque fois, 
                            ## il recherche la fonction log10 du module M
    for i in range(len(Pflat)):
        if Pflat[i] !=0:  Plogflat[i] = Mlog10(Pflat)

  4. #4
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    MErci Guigui_ enfait pour le flat j'y est pensé juste aprés avoir posté.
    Il faut que j'ajoute la fontion Mlog=M.log10. J'avais mis des timer aussi et pour le calcul d'une entropie de l'image.et je dois faire 254 fois le calcul par image et ya deux images.

    Je pensais a faire un truc...

    Calculer l'entropie d'une image seuillé a zero.. cad tout les pixels blancs.

    Ensuite je deduis la deuxieme entropie en soustrayant l'entropie d'image(Seuiller a zero) de celle que je viens de calculer.Comme ca un seul calcul d'entropie. En effet les deux images sont une image seuillée et son complémentaire.

    Voila merci merci!!! Je vous tiens au courant.

  5. #5
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Re Salut Guigui_. Voila je mets presque trois minutes pour faire un seuillage entropique sur une image 512pixels² J'ai lu dans un topic que tu faisais du traitement d'image.

    Tu peut me dire de quel type. Quel type d'operateur a tu programmé... et le temps de traitements ... Parce que j'essaie de me mettre au C++ mais c'est chaud...

    Je veux me mettre au C++ pour la rapidité d'exctution , ce n'est pas pour la rapidité de programmation ca c'est sur !! lol

    J'ai une question...j'ai entendu parler des threads en python.

    Est ce que ca permettrais d'acquerir des images venant d'un flux video et de le traiter dans la volée par exemple...

    Ca meritait peut etre de mettre toutes mes questions dans un topic....

    Si c'est le cas dis le moi. Ca seras reglés

    Merci de ton attention. bon courage.

  6. #6
    Expert éminent sénior
    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
    Points : 10 067
    Points
    10 067
    Par défaut
    Citation Envoyé par parp1
    Re Salut Guigui_. Voila je mets presque trois minutes pour faire un seuillage entropique sur une image 512pixels² J'ai lu dans un topic que tu faisais du traitement d'image.

    Tu peut me dire de quel type. Quel type d'operateur a tu programmé... et le temps de traitements ... Parce que j'essaie de me mettre au C++ mais c'est chaud...
    actuellement (enfin, j'ai pas trop le temps malheureusement de m'y consacrer pleinement), je fais du traitement d'images dans le domaine médical (2D). Mes classes sont héritées de numarray (mais je pense sérieusement à migrer vers numpy (quand j'aurai du temps et quand la doc numpy sera plus fournie aussi)).
    Mon algo principal était de récupérer le bout des doigts sur des images de mains. Pour diminuer le temps de calcul, en général, on réduit d'abord la taille des images (genre je passe de 800x600 en 300x200) et on essaie aussi de localiser le mieux le lieu de traitement (histoire de ne traiter le moins possible de pixels inutiles)
    L'algo global prend encore une bonne trentaine de secondes par main (mais le temps de calcul n'est pas le point critique de l'application).

    Citation Envoyé par parp1
    Je veux me mettre au C++ pour la rapidité d'exctution , ce n'est pas pour la rapidité de programmation ca c'est sur !! lol

    J'ai une question...j'ai entendu parler des threads en python.

    Est ce que ca permettrais d'acquerir des images venant d'un flux video et de le traiter dans la volée par exemple...
    Les threads, ca te permet simplement de faire plusieurs traitement en même temps. Ca peut donc servir pour traiter des flux video.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lenteur d'une boucle For each next
    Par Val2000 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 27/05/2013, 12h41
  2. lenteur d'une boucle FOR pour cursor
    Par zinabd dans le forum PL/SQL
    Réponses: 1
    Dernier message: 13/08/2010, 11h55
  3. Trop simple peut-etre
    Par fluodelik dans le forum Dynamique
    Réponses: 2
    Dernier message: 07/01/2008, 03h49
  4. Réponses: 4
    Dernier message: 04/05/2007, 15h30
  5. boucle for next ? peut être mais comment
    Par caro2552 dans le forum VBA Access
    Réponses: 11
    Dernier message: 07/02/2007, 21h26

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