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 de code [Python 3.X]


Sujet :

Python

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut Optimisation de code
    hello,
    je suis plutôt novice en python et je suis loin de connaître toutes les subtilités de ce langage. Mon problème est le suivant :
    je dispose d'un résultat qui est une liste de tuples comme celle-ci :
    Nom : 1500940864662-f__temp_pycom_pulses_get-resized.png
Affichages : 223
Taille : 65,6 Ko
    le but du code c'est de repérer dans les tuples ceux qui ont en premier élément un 1 et suivant la valeur du deuxième élément de remplir un tableau.
    Voici le code que j'ai écrit et qui fonctionne (data représentant les données ci dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     bits = []
            for a,b in data:
            	print(b)
            	if a ==1 and 20 <= b <= 28:
            		bits.append(0)
            	if a ==1 and 65 <= b <= 75:
            		bits.append(1)
            print("longueur bits : %d " % len(bits))
            print(bits)
    je me dis qu'il doit y avoir une façon plus élégante de traiter le problème. Qu'en pensez-vous ?

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #2
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    bonjour, pas grand chose à changer pour moi ( je suis pas un pro du python hein ^^ )

    personnellement je ferait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    bits = ""
    if data:
    	for a,b in data:
    		print(b)
    		if a:
    			if b in range(20, 28)
    				bits += "0"
    			if b in range(65, 75)
    				bits += "1"
    	print("longueur bits : %d " % len(bits))
    	print(bits)
    else:
    	print("aucune donnée")
    plutôt que d'utiliser if a == 1: / if a != 0: / if a == True:, on préfèrera if a: ( ou if not a: si a est False / 0 / -0 / 0.0 / ect).

    ATTENTION : si a est différant de 0 : a vaut True (et non pas si a vaut 1) en gros si a=0 / a =[] / a =() / a ={} / a ="" -> False, si a vaut autre chose: a=12 , a=[""] , a ="0" , a="False" ...en vrai faut être débile pour avoir une chaine de caractère "False" vus que elle vaut True... En cas de doute tu peut utiliser bool(variable) dans l'IDLE , puis après if variable: ou if not variable:.

    aussi un simple if data: permet de vérifier que la liste n'est pas vide.

    Après que bits soit une liste ou une chaine de caractère ça revient au même ici, for i in bits: retournera le même résultat, l'avantage d'une chaine de caractère est que tu peut directement l'enregistrer dans un fichier puis a relire directement (alors que avec une liste tu aura si tu relie une chaine de caractère du style "[1,0,1, ect...]"

    Après si dans ton programme t'as besoin obligatoirement d'une liste et pas d'une chaine de caractère utilise une liste, mais vus qu'avec une boucle for on passe de l'un à l'autre (si une fonction existe pour convertir une liste en str et vice versa je suis preneur ^^ )

    sinon pour passer de l'un à l'autre :
    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 list_to_str(list):
    	str = ""
    	for i in list:
    		str += i
    	else:
    		print("liste vide")
    	return str
     
    def str_to_list(str):
    	list = []
    	for i in str:
    		list.append(i)
    	else:
    		print("str vide")
    	return list
    y'a pas de raison que ça marche pas, même si je les ais pas testées

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    je me dis qu'il doit y avoir une façon plus élégante de traiter le problème. Qu'en pensez-vous ?
    Avec itertools.groupby :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> l = [(1,3),(0,5),(1,2),(2,0),(1,1),(2,2)]
    >>> from operator import itemgetter as ig
    >>> l.sort(key=ig(0))
    >>> from itertools import groupby
    >>> for k, g in groupby(l, key=ig(0)): print(k, list(g), sep="\n")
    ... 
    0
    [(0, 5)]
    1
    [(1, 3), (1, 2), (1, 1)]
    2
    [(2, 0), (2, 2)]
    >>>

  4. #4
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Avec itertools.groupby :
    Le but de l'auteur est de convertir une liste en turple en binaire de la forme (x , y) x vaut soit 1 soit 0, et y soit entre (20,28) soit (65,75)
    du code est généré que si x =1, et après 0 si y dans (20,28), 1 dans (65,75)

    Je voit mal comment ton code peut marcher sans même savoir dans quelle intervalle est y ...

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    une méthode que je trouve à titre personnel élégante et/ou résolument pythonesque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bits = [0 if 20 <= b <= 28 else 1 for a, b in data if a == 1 and (20 <= b <= 28 or 65 <= b <= 75)]
    la principale différence c'est qu'on effectue 2 fois le test 20 <= b <= 28, ça n'est donc probablement pas mieux que la version dépliée, ça a juste le mérite d'être concis.

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 813
    Points : 7 102
    Points
    7 102
    Par défaut
    Citation Envoyé par flapili Voir le message
    Le but de l'auteur est de convertir une liste en turple en binaire de la forme (x , y) x vaut soit 1 soit 0, et y soit entre (20,28) soit (65,75)
    du code est généré que si x =1, et après 0 si y dans (20,28), 1 dans (65,75)

    Je voit mal comment ton code peut marcher sans même savoir dans quelle intervalle est y ...
    C'est une bonne méthode, son code n'est pas là pour présenter la solution, mais plus pour le guider vers sa solution. Ça demande une réflexion supplémentaire, mais à le mérite de faire réfléchir, ce que ne fait pas une solution toute faîte.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    merci pour vos réponses. Je m'aperçois que mon idée de départ n'était pas si mauvaise que çà. Même si il y a des solutions plus concises ou plus performantes, le gain ne sera pas trop important et la lisibilité sera plus difficile.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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