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 :

Vitesse d'execution de code


Sujet :

Python

  1. #21
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Je n'avais jamais vraiment eu l'occasion d'utiliser numpy, donc ...

    C'est du vite fait, il y a de la place pour optimiser cela et pour utiliser numpy de façon plus élégante, et il reste certainement l'un ou l'autre bug, mais cela semble néanmoins fonctionner (testé avec les fichiers d'exemples qui se trouvent ici).
    deusyss, tu devrais pouvoir adapter cela à tes besoins...

    Le format STL stocke aussi les normales, c'est toujours ça en moins à calculer. J'ai utilisé PIL pour afficher le résultat.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    from __future__ import with_statement
    import numpy as np
     
    def loadSTL(filename):
        """Parse and load and ASCII STL file.
        Returns a list of triangles and a list of normals."""
        # could use some error checking
        triangles = []
        normals = []
        t = []
        with open(filename) as f:
            for line in f:
                line = line.lstrip()
                if line.startswith('facet normal'):
                    normals.append(map(float, line.split()[2:]))
                elif line.startswith('vertex'):
                    t.append(map(float, line.split()[1:]))
                    if len(t) == 3:
                        triangles.append(t)
                        t = []
        return triangles, normals
     
    def stl2zmap(filename,(xstep,ystep)=(1.0,1.0)):
        """Returns a height map relative to the z=0 plane"""
        t,n = loadSTL(model)
        t = np.array(t)
        n = np.array(n)
     
        # remove triangles facing away
        b = n[:,2] > 0      # normal.z > 0
        n = n.compress(b,0)
        t = t.compress(b,0)
     
        # calculate bounds
        xmax, ymax, zmax = np.max(np.max(t,0),0)
        xmin, ymin, zmin = np.min(np.min(t,0),0)
     
        # calculate 2D vectors for each triangle
        # used for triangle inclusion test
        A,B,C = t.transpose(1,0,2)[:,:,:2]
        AB = (B-A)
        BC = (C-B)
        CA = (A-C)
     
        # divide normals by their z component
        # used to compute z values
        nz = n[:,2]
        nz = np.array([nz,nz,nz]).T
        n /= nz
     
        # main loop
        data = []
        for y in np.arange(ymin, ymax+ystep, ystep):
            line = []
            data.append(line)
            for x in np.arange(xmin, xmax+xstep, xstep):
                # triangle inclusion test: check that the point
                # is on the same side of each vector of the triangle
                s1 = np.cross([x,y] - A, AB) >= 0
                s2 = np.cross([x,y] - B, BC) >= 0
                s3 = np.cross([x,y] - C, CA) >= 0
                b = (s1 == s2) & (s2 == s3)
                # keep only these triangles
                if b.any():
                    # we just need one point from each triangle
                    pt = t.compress(b,0).transpose(1,0,2)[0]
                    # and normals
                    nn = n.compress(b,0)
                    # calculate z for each remaining triangle
                    z = np.sum(nn * (pt - [x,y,0]),1) # z = (nx/nz)(x0-x)+(ny/nz)(y0-y)+z0
                    # get maximum value
                    line.append(np.max(z))
                else:
                    line.append(zmin)
        return data
     
    def zmap2img(data):
        """Convert a 2D floating point list to a greyscale image."""
        import Image
        data = np.array(data)
        # initialize image
        ysize, xsize = data.shape
        im = Image.new('L',(xsize, ysize))
        pix = im.load()
        # get bounds
        zmin, zmax = np.min(data), np.max(data)
        scale = 255 / (zmax-zmin)
        # scale and write to image
        for y,line in enumerate(data):
            for x,z in enumerate(line):
                pix[x,ysize-y-1] = (z - zmin) * scale + 0.5
        return im
     
    if __name__ == '__main__':
        model = "C:\\Prog\\python\\3D\\bottle.stl"
        data = stl2zmap(model,(0.2,0.2))
        # make a PIL Image
        img = zmap2img(data)
        img.show()
    Images attachées Images attachées  

  2. #22
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonsoir, Dividee

    Je ne suis pas chez moi jusqu'au milieu de semaine prochaine, donc standby temporaire, cependant, je viens de voir que tu as posté un code avec Numpy. J'ai pas encore eu le temps d'analyser en profondeur, mais je tenais déjà a te remercier, et on voit que tu es bien plus habituer que moi à python.

    Ensuite, pourrais tu me résumer l'action de vectoriser, en quoi cela consiste exactement?

    Enfin, j'aurais aimé savoir le temps que le code a mis pour réaliser son but? Histoire de comparer avec le mien. Mon fichier de test fait 900Ko lui et met environ 4h de calcul.

  3. #23
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Re-bonsoir Dividee. J'ai regardé un peu ton code, et bon comme ça j'ai pas tout compris. J'aurais aimé savoir si tu avais utilisé la doc d'origine, ou si tu avais utilisé une doc en français. Si c'est le cas pourrais tu m'indiquer laquelle?

  4. #24
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Bonsoir,

    Quelques chiffres:
    Pour "bottle.stl" (289K), qui contient 1240 triangles dont 591 avec normale positive, cela a pris 42s pour une résolution de 267x430 échantillons.
    Pour "teapot.stl" (469K), 2016 triangles dont 1824 avec normale positive, cela a pris 3min 42s pour une résolution de 725x356 échantillons.
    Ceci sur un Core 2 Duo T7700 (2.4 GHz).
    L'utilisation mémoire est très faible (moins de 20 Mo).

    Si ton fichier de 900K a 50% de triangles avec une normale négative, le temps d'exécution devrait être proche de celui de "teapot", pour une résolution similaire. Mais je ne sais pas de quelle résolution tu as besoin...

    La seule doc que j'ai utilisé est celle-ci, mais j'avoue que j'ai parfois du chercher la bonne fonction à utiliser... J'ai beaucoup chipoté interactivement dans l'interpréteur pour tout mettre en place, et je n'ai fait la découpe en fonction qu'à la fin.

    Le principe de la vectorisation c'est d'effectuer "en parallèle" la même opération sur un quantité importante de données.
    Par exemple, dans le code, A contient la premier point de chaque triangle (sans la coordonnée Z). C'est un tableau à 2 dimensions de taille (N,2), où N est le nombre de triangles. B est le second point de chaque triangle et C le troisième.
    L'opération B - A calcule le vecteur AB pour tous les triangles en même temps; elle soustrait le contenu des 2 tableaux élément par élément.
    Autre exemple:
    n[:,2] > 0
    Il y a d'abord un slicing multidimensionnel, le premier slice (:) concerne la première dimension, et indique de conserver toutes les lignes, la second (2) indique de conserver la troisième colonne. L'effet est donc de sélectionner uniquement la coordonnée Z de chaque normale, dans un tableau à une dimension. Le test (> 0) transforme le tableau de réels en un tableau de booléens, suivant le résultat du test pour chaque élément.

    numpy possède des règles appelées de "broadcasting" qui permettent, dans beaucoup de cas, d'effectuer des opérations sur des tableaux de tailles différentes en "agrandissant" le plus petit à la taille du plus grand.
    Par exemple, [x,y] - A semble incorrect car [x,y] est un tableau à une dimension qui ne contient que 2 éléments alors que A est de taille (N,2). Mais numpy génère un tableau à 2 dimensions en répétant [x,y] N fois: [[x,y],[x,y],[x,y]...] pour effectuer l'opération.

    De même, * permet de multiplier élément par élément deux tableaux et sum(X*Y,1) calcule donc les produits scalaires de N paires de vecteurs en une seule opération. Le 1 sert ici à indiquer suivant quelle dimension effectuer la somme, ici la seconde (la première dimension est 0).

  5. #25
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Merci Dividee pour toutes ces explications et ton code. Je pense que je vais relire le tout un certains nombres de fois avant de tout comprendre (si j'arrive un jour lol). Dur dur de s'immerger dans le monde de la prog informatique...

    je vais tacher de me demeler les pinceaux sur ton code, pour voir les differences avec le mien, et tacher d'apprendre.

    D'apres les chiffres que tu donnes, numpy a l'air d'etre vraiment beaucoup plus efficace quand on sait s'en servir.

    Dans mon code, pour des raison de qualité d'image, chaque déplacement de 0.2mm correspondait a un pixel de l'image finale. Le fichier de tests lui contient 3326 triangles si je me souviens bien. avec une image aux alentours de 1900*2100 grosso modo je crois.

  6. #26
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par deusyss Voir le message
    Dans mon code, pour des raison de qualité d'image, chaque déplacement de 0.2mm correspondait a un pixel de l'image finale. Le fichier de tests lui contient 3326 triangles si je me souviens bien. avec une image aux alentours de 1900*2100 grosso modo je crois.
    Je m'attendrais dans ce cas à un temps de traitement de tout de même 1h avec mon code.

  7. #27
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonjour,

    Même avec 1h de traitement, sa sera quand même 4 fois plus rapide que mon propre code (ou 2 fois plus rapide presque, en supprimant les triangle situés du mauvais côté. Je sais que 0.2mm de pas peut paraitre énorme, mais j'ai essayer différents pas, et également de ne prendre en compte qu'un point par triangle, comme tu l'as fait Dividee, avant d'arriver a 0.2mm. Mes essais m'ont montré que si on veut une bonne qualité d'image pour le traitement postérieur, on doit en arriver a cette précision et a 1 pixel par pas.

    Sa a l'inconvénient d'être long comme traitement. Si l'on ne respecte pas cela, le résultat est décevant: au lieu d'avoir quelque chose de bien arrondi partout, on a alors un crénelage ressemblant à des montagne, loin de l'objet originel.

    En attendant de pouvoir faire les essais, j'analyse ton code Dividee. Je pense que la semaine prochaine, après avoir fait quelques essais, j'aurais 1 ou 2 précisions à te demander sur ton code (j'ai un niveau bien inférieur au tient en prog, mais j'essaie de comprendre par moi même).

    J'aurais aimé savoir si vous auriez pu m'expliquer comment calculer la normale d'un triangle? J'ai compris qu'elle était généralement perpendiculaire au triangle, et qu'on s'en servait au niveau rendu pour la lumière, et de notre point de vue, pour trier les triangles qui nous serviront de ceux qui ne nous serviront pas. Mais au delà de ça, je bloque un peu...

  8. #28
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    La normale n'est pas "généralement" perpendiculaire au triangle, elle l'est toujours !

    Je n'ai pas vraiment dû calculer les normales, car elles se trouvent dans le fichier STL, je les ai récupérées de là. Mais calculer les normales n'est pas très compliqué.

    Si tu as un triangle de sommets A(x,y,z) B(x',y',z') C (x",y",z"), la normale est le produit vectoriel de deux côtés du triangle: n = AB x AC. Le vecteur AB = (x'-x,y'-y,z'-z) = (v1x,v1y,v1z) et AC = (x"-x,y"-y,z"-z) = (v2x,v2y,v2z). Le produit vectoriel est le vecteur (v1y * v2z - v1z * v2y, v1z * v2x - v1x * v2z, v1x * v2y - v1y * v2x).

    numpy possède la fonction "cross" qui permet de calculer le produit vectoriel.
    Avec 3 tableaux contenant tous les sommets A de chaque triangle, tous les B, et tous les C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A = array([[Ax0, Ay0, Az0],
               [Ax1, Ay1, Az1],
               ...
              ])
    (idem pour B et C), les normales de tous les triangles peuvent être calculées ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n = cross(B - A, C - A)
    En graphisme 3D, l'ordre des 3 points du triangle n'est pas anodin: si j'écris (A,C,B) au lieu de (A,B,C), j'inverse la direction de la normale. Par convention, on donne les points dans l'ordre qui donne une normale orientée du côté de la face visible (extérieure) du triangle.

    Si les vecteurs n'ont que deux dimensions (vx,vy), on considère que cela représente un vecteur à 3 dimensions (vx,vy,0) pour le calcul du produit vectoriel. Le produit vectoriel de 2 de ces vecteurs aura toujours la forme (0,0,nz). Dans ce cas numpy retourne le scalaire nz au lieu de ce vecteur. Ou un tableau de scalaire si on avait 2 tableaux de vecteurs.

    J'ai utilisé cette forme-là pour tester si un point est à l'intérieur d'un triangle:
    En 2D, si on calcule (B-A) x (P-A), le signe du résultat indique si le point P est "à gauche" ou "à droite" du vecteur AB. On fait la même chose pour les vecteurs BC et CA du triangle, si le point P se trouve du même côté des trois vecteurs, c'est qu'il est à l'intérieur du triangle.

  9. #29
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Nouvelle version, près de deux fois plus rapide que la précédente. J'ai changé le test d'inclusion dans le triangle par une technique basée sur les coordonnées barycentriques, ce qui simplifie les calculs dans la boucle intérieure.
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    from __future__ import with_statement
    import numpy as np
     
    def loadSTL(filename):
        """Parse and load and ASCII STL file.
        Returns a list of triangles and a list of normals."""
        triangles = []
        normals = []
        t = []
        with open(filename) as f:
            for line in f:
                line = line.lstrip()
                if line.startswith('facet normal'):
                    normals.append(map(float, line.split()[2:]))
                elif line.startswith('vertex'):
                    t.append(map(float, line.split()[1:]))
                    if len(t) == 3:
                        triangles.append(t)
                        t = []
        return triangles, normals
     
    def stl2zmap(filename,(xstep,ystep)=(1.0,1.0)):
        """Returns a height map relative to the z=0 plane"""
        t,n = loadSTL(model)
        t = np.array(t)
        n = np.array(n)
     
        # remove triangles facing away
        b = n[:,2] > 0      # normal.z > 0
        n = n.compress(b,0)
        t = t.compress(b,0)
     
        # calculate bounds
        xmax, ymax, zmax = np.max(np.max(t,0),0)
        xmin, ymin, zmin = np.min(np.min(t,0),0)
     
        T = t.transpose(1,0,2) # from an array of triangles to 3 arrays of points
        A3 = T[0]              # 3D point
        A,B,C = T[:,:,:2]      # 2D points
        # used for triangle inclusion test based on barycentric coordinates
        AB = B-A
        AC = C-A
        det = np.cross(AB,AC)
     
        # divide normals by their z component
        # used to compute z values
        nz = n[:,2]
        nz = np.array([nz,nz,nz]).T
        n /= nz
     
        # main loop
        data = []
        for y in np.arange(ymin, ymax+ystep, ystep):
            line = []
            data.append(line)
            for x in np.arange(xmin, xmax+xstep, xstep):
                # triangle inclusion test
                # barycentric coordinates method
                P = [x,y] - A
                l1 = np.cross(AB, P)
                l2 = np.cross(P, AC)
                b = (l1 >= 0) & (l2 >= 0) & (l1 + l2 <= det)
                # keep only these triangles
                if b.any():
                    # we just need one point from each triangle
                    pt = A3.compress(b,0)
                    # and normals
                    nn = n.compress(b,0)
                    # calculate z for each remaining triangle
                    z = np.sum(nn * (pt - [x,y,0]),1) # z = (nx/nz)(x0-x)+(ny/nz)(y0-y)+z0
                    # get maximum value
                    line.append(np.max(z))
                else:
                    line.append(zmin)
        return data
     
    def zmap2img(data):
        """Convert a 2D floating point list to a greyscale image."""
        import Image
        data = np.array(data)
        # initialize image
        ysize, xsize = data.shape
        im = Image.new('L',(xsize, ysize))
        pix = im.load()
        # get bounds
        zmin, zmax = np.min(data), np.max(data)
        scale = 255 / (zmax-zmin)
        # scale and write to image
        for y,line in enumerate(data):
            for x,z in enumerate(line):
                pix[x,ysize-y-1] = (z - zmin) * scale + 0.5
        return im
     
    if __name__ == '__main__':
        model = "C:\\Prog\\python\\3D\\bottle.stl"
        data = stl2zmap(model,(0.2,0.2))
        # make a PIL Image
        img = zmap2img(data)
        img.show()
    [EDIT:] Ce code ne fonctionne que si tous les éléments de det sont positifs. Ce qui est heureusement le cas, puisque det est en fait la coordonnée Z de la normale...

  10. #30
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonjour Dividee.

    Merci pour toute tes explications. J'ai testé la première version de mon code, et le traitement dure environ 20 mn. Concernant le 2nd code, j'ai pas encore essayé.

    Donc, je vais continuer a lire le code, et le comprendre avant de continuer. Encore merci pour ton aide

  11. #31
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Re-bonjour, désolé pour l'attente, mais j'ai eu de serieux probleme informatique.

    Bref, je suis en triain de reinstaller totalement mon PC, mais je pourrais heureusement bientot recommencer la prog.

    Dividee, je me demandais si tu conaissais une methode permettant de connaitre correctement le temps d'execution d'une appli? actuellement, j'utilise un chrono, mais c'est pas ce qu'il y a de mieux.

  12. #32
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par deusyss Voir le message
    Dividee, je me demandais si tu conaissais une methode permettant de connaitre correctement le temps d'execution d'une appli? actuellement, j'utilise un chrono, mais c'est pas ce qu'il y a de mieux.
    Bonjour,

    C'est expliqué dans la FAQ: http://python.developpez.com/faq/?pa...TempsExecution

    La première méthode qui utilise time.clock devrait te suffire, timeit convient plutôt pour comparer de petits morceaux de codes rapides.

    J'ajouterais que le module profile est aussi très intéressant: il permet de mesurer le temps d'exécution des différentes fonctions appelées pendant l'exécution (ainsi que le nombre d'appels), afin de déterminer vers quelles parties du code doivent se diriger tes optimisations.

    L'utilisation de base est simple:
    main est la fonction qui lance tout ton calcul.

    L'exécution du code sous le contrôle du profiler est ralentie, donc teste avec de petits exemples avant de le lancer sur un calcul de 20 minutes.

  13. #33
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Merci beaucoup Dividee. Mon PC sera bientot operationnel, le temps de prendre en main mon nouvel OS (Ubuntu) et de faire un test et selection de programme pr coder en python.

    La suite au prochain episode donc. Je pense pour l'instant m'orienter vers Netbeans, qui m'a l'air aussi efficace sous linux que sous Win...

    A bientot, et encore merci

  14. #34
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Par défaut
    Bonjour à tous,

    Voilà j'ai un bout de code Python qui n'utilise que des fonctions Numpy.

    Je pensais donc qu'il s'exécuterait assez rapidement.

    C'est un programme qui fait de la simulation et qui calcule 10000 fois par seconde l'évolution d'un processus physique.

    Sur ma bécanne, il nécessite environ 2 secondes pour simuler une seconde de processus.

    Etant un vieux de la programmation Fortran, je me suis amusé à le transposer en Fortran en remplaçant simplement les opérations Numpy par des boucles do

    et oh! surprise il tourne pratiquement 100 fois plus vite ...

    Je n'ai même pas le temps de voir les résultats défiler sur l'écran.

    Est ce normal?

    Je pensais que Numpy permettait d'obtenir des performances proches de celles d'un langage compilé ...
    Je m'attendais donc à un facteur entre 2 et 5 ... mais sûrement pas quelque chose autour de 100 ...

    Je me pose donc des questions.

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [MEX] Problème de vitesse d'execution d'un code C
    Par takout dans le forum MATLAB
    Réponses: 10
    Dernier message: 08/06/2012, 10h51
  2. [FLASH MX2004] Rien ne se passe qd j'execute mon code
    Par adilou1981 dans le forum Flash
    Réponses: 2
    Dernier message: 27/07/2005, 23h31
  3. [Language]Calculer Vitesse d'execution
    Par schneiderj dans le forum Langage
    Réponses: 12
    Dernier message: 27/04/2005, 20h43
  4. [C#]Comment executer du code qui se trouve dans une string ?
    Par freddyboy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/02/2005, 16h31
  5. vitesse d'execution
    Par bakonu dans le forum OpenGL
    Réponses: 15
    Dernier message: 07/05/2004, 11h18

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