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 :

réflexion sur python


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 220
    Par défaut réflexion sur python
    Bonjour,


    J'utilise python pour trouver à partir d'une séquence de départ A contenant plus de 5 000 000 de nucléotides (c'est-à-dire 5 000 000 de lettres qui sont soit A, C, G, T) les sous-régions unique possédant une taille minimum de 20, le tout par rapport à une séquence B de plus ou moins la même taille.

    Pour cela, je créé une hashmap<clé, valeur> ayant comme clés toutes les sous-séquences de taille 20 que j'ai dans ma séquence A et comme valeur les positions ou elles ont été trouvée. Ensuite je supprime les doublons par rapport à B.

    Pour avoir les régions, il me faut rassembler toutes les valeurs consécutives.
    Exemple d'entrées dans ma hashmap:
    <"AAAAAAAAAAAAAAAAAAAA", [1555, 18474]>
    ...
    <"CAAAAAAAAAAAAAAAAAAA", [1554]>
    ...
    <"AAAAAAAAAAAAAAAAAAAG", [1556]>
    => on sait que l'on a une region qui est CAAAAAAAAAAAAAAAAAAAAG

    Étant donné que je travaille avec de grande quantité de données, les performances peuvent facilement chuter...

    Par exemple, au départ j'étais parti sur une idée ou les entrées de ma hashtable auraient comme clé la sous-séquence de taille 20 et comme valeur un vecteur de positions.
    <"AAAAAAAAAAAAAAAAAAAA", [1555, 18474]>

    Constation, j'ai du remplacer le vecteur de positions par une chaine de caractères:
    <"AAAAAAAAAAAAAAAAAAAA", "1555_18474">
    Ainsi je passe de + de 300 sec à 7sec!
    (pour récupérer les position je split sur "_")

    Une autre anomalie que j'ai constaté est que lorsque je veux trier un vecteur de + 3 000 000 d'entrées, je mets plus de 350sec (avec un comparateur que j'ai implémenté : mon_array.sort(monComparateur)).
    Comme solution, il est plus rapide de construire une nouvelle hashmap avec 3 000 000 entrées où les clés représentent les indices. Ensuite on incrémente un indice jusque 3 000 000 en testant si la clé existe dans la hashmap. Ainsi je passe à 19sec.

    Que pouvez-vous me dire de ces 2 problèmes rencontrés?

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 11
    Par défaut
    déja, pour chercher dans un dictionnaire(qui un hash map en python) il est totalement inutile d'itérer sur les clés. C'est le principe même des hash tables de ne pas avoir à itérer.

    Il existe un Python une methode vraiment bien des dictionnaires:
    dict.get(key,default)
    qui retourne la valeur de key si key existe dans le dictionnaire(dict[key]), et default si key n'est pas une clé du dictionnaire, et ce (corrigez moi si je me trompe) en temps constant.
    Donc si ton dictionnaire s'appelle data:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    value = data.get("AAA...CGT",None)
    if value: #sous entendu !=None
        #utilisation de celle ci...
    Pour ton deuxième, en fait ton premier problème, je ne suis pas sur de comprendre pourquoi il y a une si grande variation de performance, peut tu nous montrer du code?

  3. #3
    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
    Pour avoir les régions, il me faut rassembler toutes les valeurs consécutives.
    Exemple d'entrées dans ma hashmap:
    <"AAAAAAAAAAAAAAAAAAAA", [1555, 18474]>
    ...
    <"CAAAAAAAAAAAAAAAAAAA", [1554]>
    ...
    <"AAAAAAAAAAAAAAAAAAAG", [1556]>
    => on sait que l'on a une region qui est CAAAAAAAAAAAAAAAAAAAAG
    Je ne connais pas l'impact sur les performances, et je ne connais strictement rien à l'ADN, mais ne serait-il pas plus simple de d'avoir directement un dico avec les bonnes régions ? style :
    <"AAAAAAAAAAAAAAAAAAAA", ( (1555,20), (18474,20) )>
    ...
    <"CAAAAAAAAAAAAAAAAAAAAG",( (1554, 22) )>
    ou même carrément remplir en live une bdd style bsddb qui permet un classement "record" (les clé seront simplement empilée (pas de tri)), ce qui permetterait une plus grande mémoire vive disponible.

Discussions similaires

  1. Réflexion sur l'activité de chef de projet
    Par gnaoui_9999 dans le forum Emploi
    Réponses: 1
    Dernier message: 06/11/2006, 23h26
  2. Réflexion sur les INDEX ... !!! ??? !!!
    Par snoopy69 dans le forum Oracle
    Réponses: 4
    Dernier message: 22/09/2005, 15h58
  3. [Java 5] Réflexion sur les énumérations type-safe
    Par rozwel dans le forum Langage
    Réponses: 5
    Dernier message: 04/12/2004, 20h34

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