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 :

Ou ranger les objets dans Python ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut Ou ranger les objets dans Python ?
    Bonjour à tous,

    juste une petite question...
    Ou ranger les objets dans Python ?
    aujourd'hui, après avoir crée un objet, je le range dans un dictionnaire
    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
     
    class Point():
        """ Definition d'un objet Point"""
        def __init__(self,Id):
            self.Id=Id
            self.X=0
            self.Y=0
            self.Z=0
    if __name__ == '__main__':
     
      Dico={} # Création d'un dictionnaire
     
      Dico[1234]=Point(1234) # Juste après la création, je range l'objet dans un                Dictionnaire
     
      extraction_valeur=Dico[1234].X    # pour retrouver l'objetpar son Id, j'utilise les cles du dictionnaire
      print(extraction_valeur)
    Cette solution marche, mais est ce la plus pertinente, en effet, je doit aujourd'hui utiliser un dictionnaire avec 124000 Points, et ça rame ... beaucoup, lorsque je vérifie la presence d'un point dans le dictionnaire,
    Donc y a t-il une méthode plus performante, et si oui, laquelle ?

    Par avance merci,
    Loic

  2. #2
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    avec 124000 Points, et ça rame ... beaucoup, lorsque je vérifie la présence d'un point dans le dictionnaire,
    C'est normal, plus un dictionnaire est grand, et plus il sera long pour l'ordi de trouver la bonne clé, peut-être devrais-tu stocker tes objets dans une liste, je pense (sans certitude) que ces dernières sont un peu plus rapide, dans le sens où si tu connais l'index, la liste ayant un classement, y'a plus véritablement d'étape de recherche comme pour un dico (qui lui n'a pas de classement), où tout du moins elle n'est pas aussi longue.

    Sinon, si tu sais dériver une class, tu pourrait faire dériver la classe de tes objets d'une liste, ça pourrait de la sorte coller parfaitement à tes besoins, par contre ça n'irait pas pour autant plus vite

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    Dans le sens où si tu connais l'index, ...
    Merci pour la réponse, mais
    Mon problème est d'associer l'index à l'identifiant de mon objet (qui me sert aujourd'hui pour retrouver/utiliser mon objet)
    la liste me renvois juste la référence de cette instance (voir ci dessous) ou alors j'ai pas tout compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     Liste=[] # Création d'une liste  
      Liste.append(Point(1234)) # Juste après la création, je range l'objet dans un liste
      print Liste[0]
     
      ##
      ##  >>> 
      ##  <__main__.Point instance at 0x01219328> La reponse de python
    Une solution serait :
    1- de dériver la class Int,
    2- de ranger ces instances dans la liste
    Ce qui me permettra (peut être) de retrouver mon identifiant ...

    je voudrais savoir avant de me lancer dans une telle aventure, si cette méthode est susceptible de répondre à mon problème, ne vais-je pas réinventer la class dictionnaire en moins bien ???

    Mais comment y font les vrais programmeur ???

  4. #4
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    En fait, j'me suis dit qu'une classe Container dérivée d'un dico pourrait fonctionner... le principe de cette classe étant.... voyons un exemple, ce sera plus explicite
    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
    >>> a=Container()
    >>> a[1258]=1258
    >>> a[1258]
    1258
     
    #bon à première vue, rien de neuf, mais regardons un attribut de cette classe:
    >>> a.dict
    {1200:{1258:1258}}
     
    #continuons de rentré des valeurs
    >>> a[1289]=1289
    >>> a[518]=518
    >>> a.dict
    {500:{518:518}
    1200:{1289:1289, 1258:1258}
    En fait, le but de cette classe est de classer les clé dans des "tranches", ce qui veut dire que toutes les clés >=1200 <1300 seront stockées dans un dictionnaire dont la clé est 1200...
    J'ai du mal à m'expliquer mais j'éspère que t'as piger le principe, en théorie quand on appellera une valeur (ex:986), plutôt que de chercher parmi 1700 clés (en admettant qu'il n'y en ai pas plus), l'ordi cherchera dans un premier temps la clé 900 parmi les 17 disponibles, puis il cherchera enfin 986 parmi l'eventuelle centaine de clé présente, cela devrait -en théorie donc- mettre moins de temps que de chercher parmis 1700 clés désordonnées...
    Voici le code de cette classe :
    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
    class Container(dict):
        def __init__(self):
            self.dict={}
        def __setitem__(self,key,value):
            #admettons 134
            if type(key)!=int: raise ContainerIntError
            key_range=key/100*100
            if self.dict.has_key(key_range):
                self.dict[key_range][key]=value
            else:
                self.dict[key_range]={key:value}
        def __getitem__(self,key):
            key_range=key/100*100
            return self.dict[key_range][key]
     
    class ContainerIntError(Exception):
        def __str__(self): return 'Key must be integer !'
    Evidemment on pourrait pousser la classification plus loin encore, mais je me dis qu'encore plus de classification, encore plus de mémoire prise... à toi de voir...

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonjour et en utilisant tout simplement un sgbd c'est performant et c'est fait pout ça

  6. #6
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    C'est quoi sbdg ?

    Sinon, je viens de passer ma classe à un timeit et je l'ai comparée avec un dictionnaire équivalent et autat de clés (1600), et ma classe n'est plus rapide qu'en théorie...
    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
    a=Container()
    >>> for x in range(1600):
    	a[x]=x
     
    >>> b={}
    >>> for x in range(1600):
    	b[x]=x
     
    >>> import timeit
    >>> timeit.Timer('''a[1592]
    a[1000]
    a[596]''','from __main__ import a,b').timeit()
    2.2382217065716694
    >>> timeit.Timer('''b[1592]
    b[1000]
    b[596]''','from __main__ import a,b').timeit()
    0.23214176056998426

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    Sauf erreur de ma part, un SGBD, est un Système de Gestion de Base de données ....
    Mais je ne les connais pas suffisamment pour les utiliser,

    je me pose toujours la question de savoir si je doit après chaque extraction d'un point (pour son éventuel modification), je doit le ranger tout de suite ou le laisser dans le curseur de la SGBD ....

Discussions similaires

  1. Lire un fichier binaire et ranger les données dans un tableau
    Par Flaherty Mc Coillean dans le forum Débuter
    Réponses: 1
    Dernier message: 31/05/2009, 17h45
  2. Réponses: 2
    Dernier message: 09/12/2008, 09h57
  3. Centrer verticalement les objet dans un flow layout ?
    Par Djobird dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 05/09/2008, 09h08
  4. Ranger les .dll dans le .exe
    Par imados dans le forum VB.NET
    Réponses: 19
    Dernier message: 16/09/2007, 16h57
  5. Ranger ses objets dans LDAP avec les OU (OrganizationalUnit)
    Par Fuego dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/02/2007, 15h04

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