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 :

Optimisation d'une partie de code


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Par défaut Optimisation d'une partie de code
    Bonjour

    Débutant sous python, je souhaiterais savoir s'il est possible d'optimiser une partie d'un code

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    a=arange(0.,180.)
    
    b=arange(0.,360.)
    
    
    rows=len(a)
    
    cols=len(b)
    
    #plot_test=array([[0.]*7]*(cols*rows))
    plot_test=array([0.]*(cols*rows))
    
    
    a =flipud(repeat(a,cols))
    
    b =tile(b,rows)
    
    print b, a
    
    
    
    for i in range(0,len(a)):
        cond1 = a[i]>=(tab[:,2])
        
        cond2 = a[i]<(tab[:,8])
        
        cond3 = b[i]>=(tab[:,1])
        
        cond4 = b[i]<(tab[:,3])
        
        cond = cond1 & cond2 & cond3 & cond4
        
        ligne = tab[cond]
    stop


    est il possible d'écrire cette partie de code en rouge sans la boucle for

    merci par avance

    je tiens à préciser que le code marche (je n'ai fourni qu'une partie, il n'y a pas la partie traitement des données qui donne le tab) mais je souhaiterais que ça aille plus vite. A partir d'un test avec une fonction time, c'est la partie en rouge qui est trop lente. Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Par défaut
    Je ne sais pas trop ce que tu fais de tes conditions, mais tu dois déjà pouvoir aller plus vite en coupant les tests non nécessaires.

    En faisant quelque chose comme ca, par exemple:
    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
     
    for i in range(0,len(a)):
        if not a[i]>=(tab[:,2]):
            continue
     
        if not a[i]<(tab[:,8]):
            continue
     
        if not b[i]>=(tab[:,1]):
            continue
     
        if not b[i]<(tab[:,3]):
            continue
     
        # Une fois arrivée ici, tu est forcement dans le cas:
        #    cond1 & cond2 & cond3 & cond4.
    Après il faut que tu vois la construction de tes tableaux intermédiaires tab[:,N] ne sont pas factorisable, parce que ca consomme du temps, aussi.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Par défaut
    merci pour la réponse

    Mais je ne comprends pas comment ddans ce cas comment j'obtiens ma réponse, comment je trouve la ligne de mon tableau qui correspond aux quatre conditions réunies


  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    je ne comprends pas bien ton utilisation de cond. Dans ton programme, cond est un booléen (donc 0 ou 1). tab[cond] c'est vraiment ce que tu souhaites faire ? ou alors c'est tab[i] pour i tel que cond vaille True ?

    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
    for i in range(0,len(a)):
        if not a[i]>=(tab[:,2]):
            continue
     
        if not a[i]<(tab[:,8]):
            continue
     
        if not b[i]>=(tab[:,1]):
            continue
     
        if not b[i]<(tab[:,3]):
            continue
     
        break
     
    ligne=tab[i]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Par défaut
    en faisant mes conditions de 1 à 4 et en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cond= cond1 & cond2 & cond3 & cond 4
    , j'obtiens l'index de la ligne où ces quatre conditions sont true, du coup] me renvoie la ligne qui correspond à ma recherche

    je saisis pas la methode du if not, je vois pas comment toutes mes conditions sur une même de mon tableau seront réunies ensemble.

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    hmm désolé, je me rends compte que ce sont des tableaux numpy.

    connais tu where ?

    http://docs.scipy.org/doc/numpy/refe...mpy.where.html

    ça peut permettre de t'affranchir du for.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Par défaut
    je me demande s'il est possible d'enlever la boucle for dans la partie du code en rouge, c'est à dire écrire cette partie de code sans une seule boucle pour l'optimiser

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    a=arange(0.,180.)
    
    b=arange(0.,360.)
    
    
    rows=len(a)
    
    cols=len(b)
    
    #plot_test=array([[0.]*7]*(cols*rows))
    plot_test=array([0.]*(cols*rows))
    
    
    a =flipud(repeat(a,cols))
    
    b =tile(b,rows)
    
    print b, a
    
    
    
    for i in range(0,len(a)):
        cond1 = a[i]>=(tab[:,2])
        
        cond2 = a[i]<(tab[:,8])
        
        cond3 = b[i]>=(tab[:,1])
        
        cond4 = b[i]<(tab[:,3])
        
        cond = cond1 & cond2 & cond3 & cond4
        
    ligne = tab[cond]
    merci d'avance

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/07/2007, 11h44
  2. comprendre une partie du code
    Par mademoizel dans le forum ASP.NET
    Réponses: 4
    Dernier message: 09/02/2007, 11h40
  3. comprendre une partie de code
    Par menuge dans le forum Langage
    Réponses: 24
    Dernier message: 03/09/2006, 20h44
  4. une partie du code a disparu
    Par recup dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 08/03/2005, 10h08
  5. Indenter une partie du code
    Par KooX dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/05/2004, 17h38

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