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

Calcul scientifique Python Discussion :

Benchmark conversion list-->numpy.array


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut Benchmark conversion list-->numpy.array
    Bonjour à tous

    Je cherche différent moyen de caster une liste (ou une portion de liste) en un numpy array. J'aurais besoin de plusieurs méthodes différentes selon les besoins/la situation alors je me disais pourquoi pas faire une classe qui dériverait de list et qui ajouterais à ce type les différentes méthodes de cast vers un array que je souhaites proposer.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    import numpy as np
    from time import time
     
    datasize=10000
     
    rd = np.random.RandomState(seed=0)
    data = list( rd.rand(datasize) )
     
     
    #### Option 1 : Une fonction exterieur
    def to_nparray(datalist):
        return np.array(datalist)
     
    #### Option 2 : On creer une classe qui derive de list
    class MyList(list):
        def to_nparray(self):
            return np.array(self)
     
    data2 = MyList(data)   
     
    Niter4access = int(1e7)
    Niter4nparr_cast= int(1e4)
     
    t0 = time()
    for i in range(Niter4access) : b=data[i%datasize]
    t1 = time()
    for i in range(Niter4access) : b=data2[i%datasize]
    t2 = time()
    for i in range(Niter4nparr_cast) : b=to_nparray(data)
    t3 = time()
    for i in range(Niter4nparr_cast) : b=data2.to_nparray()
    t4 = time()
     
    print("======== Exec time ========")
    print("-- Particular acces (%s iter) ---"%Niter4access)
    print("External fct: %s"%(t1-t0))
    print("Class method: %s"%(t2-t1))
    print("-- np.array cast (%s iter) ---"%Niter4nparr_cast)
    print("External fct: %s"%(t3-t2))
    print("Class method: %s"%(t4-t3))
    A ma grande stupeur faire une nouvelle classe est donc bien plus couteux !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ======== Exec time ========
    -- Particular acces (10000000 iter) ---
    External fct: 1.5281527042388916
    Class method: 2.4622461795806885
    -- np.array cast (10000 iter) ---
    External fct: 5.599560022354126
    Class method: 6.787678480148315
    Quelqu'un peut-il tester chez lui et me dire s'il a les mêmes différences entre les 2 cas ? Qqn a-t-il une explication de pourquoi y a t il autant de différence sur le temps d'éxécution (+60% en coût sur l'accès particulaire tout de même ce n'est pas rien, et +27% sur la conversion ). Je sais qu'on rajoute une classe, donc c'est plus lourd. Mais à ce point ...

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,

    Au début, je pensais que tu étais sur un cas trompeur, car les temps que tu montres pourraient laisser penser que c'est juste l'initialisation de l'objet qui est un temps incompressible, j'ai donc refait ton test mais en multipliant par 10 les ranges, et là, on voit bien une différence qui n'est pas lié uniquement à l'initialisation de l'objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ======== Exec time ========
    -- Particular acces (100000000 iter) ---
    External fct: 16.96150016784668
    Class method: 27.86549997329712
    -- np.array cast (100000 iter) ---
    External fct: 60.59150004386902
    Class method: 74.43249988555908
    Bon après, je n'ai pas l'explication mais je trouve ça moche...

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    La création des arrays est faite avant que je ne déclenche les chrono via time, donc ce temps là n'est pas compté dedans. Et on s'attends en effet à ce qu'à la création il y est un surcoût, mais celui là je suis prêt à le payer. Celui sur l'extraction où l'appel à la méthode, moins ....

    Le fait que tu l'ait lancé (merci d'ailleurs pour ce temps que tu as pris) m'indique déjà que c'est à priori "normal" et pas lié à mon installation (tu as aussi un bon 60% d'augmentation du cout sur l'accès particulaire).

    Si qqn a une explication je la veux bien.

    Du coup, je vais opté pour un ensemble de fonctions externes plutôt qu'une nouvelle classe. Ca sera un peu plus crade car moins sémantique, mais là le prix est trop exhorbitant sur le nombre de fois où j'aurais à le faire. Si qqn a une solution intermédiaire, je suis preneur également.

  4. #4
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Non, rien j'ai dit une connerie...

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bon, a priori, c'est une raison de recherche dans divers dictionnaire liée aux classe qui ferait ça...

    Une petite explication (en anglais) : https://stackoverflow.com/questions/...s-twice-as-slo

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Même résultat et pas d'explications.

    Citation Envoyé par disedorgue Voir le message
    Bon, a priori, c'est une raison de recherche dans divers dictionnaire liée aux classe qui ferait ça...
    C'est une hypothèse qui se teste facilement en mettant la méthode appelée dans une variable (çà évite la recherche).
    J'ai testé, il y a un petit mieux mais trop "petit" pour être l'explication.
    Un autre test est d'appeler la fonction en lui passant l'instance en paramètre: même punition.

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

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

Discussions similaires

  1. [Python 2.X] Extraire données numpy array vers une liste ?
    Par Ben20 dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 05/03/2015, 11h30
  2. créer une liste de numpy.array
    Par jean-pat dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 11/03/2011, 21h13
  3. Conversion variable texte en array
    Par t-too dans le forum MATLAB
    Réponses: 1
    Dernier message: 11/07/2007, 09h07
  4. liste chainée ou array
    Par arno. dans le forum C
    Réponses: 6
    Dernier message: 20/08/2006, 20h28
  5. Conversion List -> String
    Par Bayard dans le forum Général Python
    Réponses: 1
    Dernier message: 27/11/2005, 21h50

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