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 tri de nombres sur plusieurs colonnes par ordre croissant


Sujet :

Python

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut Optimisation de tri de nombres sur plusieurs colonnes par ordre croissant
    hello,
    voilà je cherche à optimiser le code d'une macro python LibreOffice que j'ai fabriquée pour trier des nombres dans des cellules de LibreOffice Calc(je suis Newbie Python donc pas au top au niveau optimisation). Plutôt qu'un long discours voici une copie d'écran de ce que je veux réaliser avec la macro :

    Nom : trie_colonnes.PNG
Affichages : 1665
Taille : 63,1 Ko

    A gauche les données de départ, A droite ce que je veux obtenir ( tri des nombres Résultat par colonne et pas de doublon)

    Voici le code qui me permet d'y arriver :
    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
    def test_tableau():
        desktop = XSCRIPTCONTEXT.getDesktop()
        calc = desktop.getCurrentComponent()
        sheet = calc.getSheets().getByIndex(0)
        a = sheet.getCellRangeByName("A1:G10")
    	# on récupere les data en une seule fois
        plage = a.getDataArray()
    	# on crée une liste à une dimension à partir de la plage
        listeNombre = [item for sublist in plage for item in sublist]
    	# on classe par ordre croissant les nombres et on enlève les doublons
        matrice = sorted(set(listeNombre))
    	# on recrée la plage à partir de la liste triée sans doublon
    	# en inversant les lignes et les colonnes
        totallist = []
        for i in range(0,10,1):
            rowlist = []
            for j in range(0,7,1):
                try:
                    rowlist.append(matrice[j*7 +i])
    	# si matrice[x] n'existe pas on met un élément vide
                except:
                    rowlist.append('')
            totallist.append(tuple(rowlist) )  
        # on définit la plage ou on va écrire
        b = sheet.getCellRangeByName("I1:O10")
        # on écrit en une fois la plage résultat
        b.setDataArray(tuple(totallist))	
    g_exportedScripts = test_tableau,
    La question est : n'y a-t-il pas moyen d'optimiser la partie tri et génération de la plage de sortie ?

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

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    Arf ! je viens de constater qu'il y a une erreur dans le résultat certainement due au fait qu'il n'y a pas le même nombre de lignes que de colonnes dans la plage de départ . Donc code à revoir !

    bon ! j'ai trouvé l'erreur voici le bout de code corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       totallist = []
        for i in range(0,10,1):
            rowlist = []
            for j in range(0,7,1):
                try:
                    rowlist.append(matrice[j*10 +i])
    	# si matrice[x] n'existe pas on met un élément vide
                except:
                    rowlist.append('')
            totallist.append(tuple(rowlist) )
    et voici le résultat :
    Nom : trie_colonnes_new.PNG
Affichages : 449
Taille : 80,5 Ko
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Points : 218
    Points
    218
    Par défaut
    Bonjour,

    Utilise de cProfile ( un tuto ici : http://ymichael.com/2014/03/08/profi...-cprofile.html )

    Si malgré l'optimisation de ton code tu n'arrive pas à l'effet escompté je te conseille de regarder du côté de -> http://cython.org/

    Il semble que tu manipule des tableaux, tu peu regarder du côté de numpy -> http://www.numpy.org/

    Quelques tips -> https://wiki.python.org/moin/PythonS...erformanceTips

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    merci de ta réponse IPreferCSharp mais c'est plutôt dans la façon d'écrire le code ( en moins de ligne par exemple) que dans les performances que je recherche l'optimisation. Je sais qu'il y a des gourous de python dans le forum qui connaissent toutes les ficelles du langage ( par exemple les fonctions zip ou map) pour pouvoir peut-être éviter les boucles de balayage. A noter que dans la mesure du possible, il ne faut pas utiliser numpy car il n'est pas installé de base dans le python embarqué (version 3.3) du LibreOffice que j'utilise (4.3.5.2) sous windows 7.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

    Citation Envoyé par jurassic pork Voir le message
    Je sais qu'il y a des gourous de python dans le forum qui connaissent toutes les ficelles du langage ( par exemple les fonctions zip ou map) pour pouvoir peut-être éviter les boucles de balayage.
    Est ce que le problème posé mérite d'en arriver là?

    Vous partez d'une liste de nombre (numbers) affichée sous la forme d'un tableau pour en supprimer les doublons, la ranger et l'afficher sous la forme d'un autre tableau "numbers = sorted(set(numbers))" devrait suffire.

    Après il y a deux questions LibreOffice: comment lire et écrire (une liste de nombre) sous forme d'un tableau. Mais leur réponse dépend de ce qu'offre l'API de LibreOffice.

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

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Est ce que le problème posé mérite d'en arriver là?
    tu as raison, mon code n'est pas si "pourri" que ça et en fait ne contient pas beaucoup de lignes de code.

    Citation Envoyé par wiztricks Voir le message
    Après il y a deux questions LibreOffice: comment lire et écrire (une liste de nombre) sous forme d'un tableau. Mais leur réponse dépend de ce qu'offre l'API de LibreOffice.
    ça je le fais dans mon code par les fonctions getDataArray et setDataArray.

    Bon je mets le post en résolu, je me suis posé certainement un faux problème puisque j'arrive à faire ce que je veux en pas trop de lignes de code.

    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. [OpenOffice][Tableur] Comment trier numéros sur plusieurs colonnes par ordre croissant
    Par bordelaplage dans le forum OpenOffice & LibreOffice
    Réponses: 8
    Dernier message: 10/04/2015, 23h16
  2. tri par moyenne sur plusieurs colonnes
    Par adr22 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/12/2007, 16h19
  3. Réponses: 2
    Dernier message: 06/09/2007, 15h08
  4. [Tableaux] tri sur plusieurs colonnes
    Par melisse dans le forum Langage
    Réponses: 2
    Dernier message: 22/02/2007, 09h51
  5. Tri sur plusieurs colonnes
    Par soso78 dans le forum Access
    Réponses: 2
    Dernier message: 04/03/2006, 15h28

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