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 :

[Déb] optimisation boucle for


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [Déb] optimisation boucle for
    Bonjour,
    Je suis nouveau en programmation et en python, j'ai écris ça qui répond à mon besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    user_param.ResetAlarm = [1,1,0,0,0,0]
    	Reset = 0
    	for i in range(len(user_param.ResetAlarm)):
    		DB["LOGERROR"].SetValue = str(user_param.ResetAlarm[i])
    		Reset = Reset + (user_param.ResetAlarm[i])*2**(len(user_param.ResetAlarm)-i-1)
    Je me dis qu'il y a sûrement moyen d'optimiser cela avec la puissance de python !
    des idées ?

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Qu'entends-tu par "optimiser" ? Tu fais une boucle sur un tableau de taille ridicule, c'est pas le temps de que ça doit prendre à s'exécuter

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut
    Bonjour,

    déjà, tu peux utiliser enumerate

    ainsi, tu aura l'index et le contenu directement
    Le savoir est une arme alors soyons armés

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    enumerate() permet en effet de simplifier le code.

    J'ai tenté de faire une version optimisée et je compare les 2 versions :
    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
    from timeit import default_timer as timer
     
    ResetAlarm = [i*1 for i in range(0, int(10e4))]
     
    def version_1():
        Reset = 0
        for i in range(len(ResetAlarm)):
            Reset = Reset + (ResetAlarm[i])*2**(len(ResetAlarm)-i-1)
        return Reset
     
    def version_2():
        Reset = 0
        length = len(ResetAlarm)
        for i, value in enumerate(ResetAlarm):
            Reset += value * 2**(length - i - 1)
        return Reset
     
    def exec_time(f):
        start = timer()
        f()
        end = timer()
        print(f.__name__ + " was executed in " + str(end - start))
     
    if __name__ == "__main__":
        assert version_1() == version_2()
        exec_time(version_1)
        exec_time(version_2)
    J'ai fait un tableau plus grand pour que les temps d'exécution soit suffisamment longs pour être représentatif.

    Voici les résultats :
    version_1 was executed in 14.315287378839203
    version_2 was executed in 14.296836086137567

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut
    J'étais moi aussi entrain de voir si on gagnait vraiment en performance

    au moins, ça allège un peu l'écriture
    Le savoir est une arme alors soyons armés

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par guigui82 Voir le message
    Je me dis qu'il y a sûrement moyen d'optimiser cela avec la puissance de python !
    des idées ?
    Ben, déjà la 4ème ligne pourrait être sortie de la boucle.
    Quant au reste, il ne sert qu'à calculer la valeur décimale correspondant à une constante binaire exprimée sous la forme [1,1,0,0,0,0].
    Si vous voulez virer la boucle et garder le littéral pour la lisibilité, vous pourriez écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    L = 0b110000
    DB["LOGERROR"].SetValue = str(L%2)
    Reset = L
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    par "optimiser" j'entendais faire un code plus simple, ou plus intelligent en fait...
    Je sais que python possède de nombreuses fonctions permettant de simplifier ou d'utiliser des fonctions existantes...
    Le timing m'importe peu en fait effectivement c'est un petit tableau !
    Merci pour vos réponses en tout cas je retiens le enumerate !


    @wiztricks : Mon entrée est un tableau d'entier, pour utiliser ta version il me faudrait le transformer en un type binaire...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par guigui82 Voir le message
    @wiztricks : Mon entrée est un tableau d'entier, pour utiliser ta version il me faudrait le transformer en un type binaire...
    Une suite de 0 et de 1 restera une suite de 0 et de 1 quelque soit la représentation (tableau/entier/...) utilisée. C'est une mise en forme différente de la même information. Et si vous cherchez à optimiser, autant utiliser les types "natifs" plutôt que d'inventer les vôtres et ramer à faire des conversions.

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

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Quant au reste, il ne sert qu'à calculer la valeur décimale correspondant à une constante binaire exprimée sous la forme [1,1,0,0,0,0].
    Oh punaise ! J'avais pas trop cherché à comprendre !

    Du coup j'ai écrit une version 3 avec l'écriture la plus naturelle pour moi, à savoir un décalage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def version_3():
        Reset = 0
        length = len(ResetAlarm)
        for i in range(length, 0, -1):
            Reset += ResetAlarm[i - 1] << (length - i)
        return Reset
    Résultats :
    version_1 was executed in 14.239275085712297
    version_2 was executed in 16.292170159938276
    version_3 was executed in 0.2349563372657819
    Tadam !

Discussions similaires

  1. Optimisation boucle for
    Par bertindenis dans le forum MATLAB
    Réponses: 4
    Dernier message: 13/10/2017, 23h37
  2. [XL-2010] Optimisation boucle for (temps d’exécution trop important)
    Par barbeaua dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 20/07/2016, 15h25
  3. optimisation boucle for
    Par achtlos dans le forum Images
    Réponses: 1
    Dernier message: 29/05/2011, 09h53
  4. Optimisation boucle for
    Par kwatz dans le forum MATLAB
    Réponses: 10
    Dernier message: 03/03/2009, 08h48
  5. [Optimisation] Boucles for ou while et mysql_result ?
    Par sorenson dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2006, 09h55

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