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 d'une fonction, diminution temps de calcul


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 44
    Par défaut optimisation d'une fonction, diminution temps de calcul
    Bonjour, voila lors du dernier sujet que j'ai créer et dans lequel on m'a bien aider j'ai demander comment une alternative pour calculer l'exponentialle de tres tres grandes valeurs. Un manbre m'a donner la solution ci-dessous:

    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
    def expdec(x, nbc=None):
        """Calcul de e à la puissance x avec nbc chiffres significatifs"""
        if type(x)!=type(Decimal):
            x = Decimal(str(x))
        if nbc==None:
            eps=Decimal("1.0e-" + str(getcontext().prec))
        else:
            eps=Decimal("1.0e-" + str(nbc))
        s1 = 1
        k = 1
        n = Decimal("0")
        while True:
            #print s1
            n += 1
            k *= x/n
            s2 = s1 + k
            if abs(s2-s1)<eps:
                break
            else:
                s1 = s2
        return s2



    On peut voir que cette fonction reprend en fait la serie convergente pour approximer l'exponentielle et du coup avec le module decimale on ne joue plus avec des flottans mais avec des "Decimal".


    En fait cette fonction fonctionne tres bien seulement lorsque je fait par exemple expdec(100000) c'est tres long....

    Je voudrai savoir s'il est possible d'optimiser cette fonction pour taccourcir ,le temps de calcul de python...

    merci

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    C'est moi qui t'ai proposé cette fonction fabriquées "sur les genoux".

    Voilà ma dernière proposition:

    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
     
    def expdec(x):
        """Calcul de e à la puissance x"""
        if type(x)!=type(Decimal):
            x = Decimal(str(x))
        s1 = 1
        k = 1
        n = 0
        while True:
            n += 1
            k *= x/n
            s2 = s1 + k
            if s2==s1:
                break
            else:
                s1 = s2
        return s2
    Question rapidité, on trouve tout de même le nombre e avec 50 décimales en 7/1000 de seconde... (2.7182818284590452353602874713526624977572470936998)

    Il existe probablement d'autres algorithmes (CORDIC?), mais je ne les connais pas.

    Attention aussi à ne pas faire des calculs avec des nombres trop grands par rapport au but poursuivi.

    Tyrtamos

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 44
    Par défaut
    Bonjour, ba en fait justement j'ai besoin de faire des calculs avec des nombre tres grands du genre expdec(1e15) et la sa devient long...donc je voulais savoir s'il y a pas une autre solution...ce que je comprend pas c'est qu'avec matlab par exemple c'ext vraiment super rapide...

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Effectivement, avec des nombres tels que e à la puissance 1000000000000000, ma solution demande trop longtemps (même avec psyco). Et je ne connais pas d'autres algorithmes qui feraient cela beaucoup plus vite (mais ça existe peut-être, je ne suis pas spécialiste de ce domaine).

    Peut-être peux-tu faire ça avec une bibliothèque traitant des grands nombres comme la bibliothèque "gmp" (http://gmplib.org/)? Je l'ai déjà utilisée en C, et je l'ai trouvé très très rapide. Il y a un module pour Python qui s'appelle "gmpy", mais je ne l'ai jamais utilisé. La dernière version doit être la 1.04, et il y a des binaires pour windows, linux et mac. Il devrait y avoir des solutions plus performantes que les miennes (il est même possible que ce soit les mêmes que dans matlab).

    Sinon, tu devrais revoir ton problème. Il est extrêmement rare qu'on ait besoin de manipuler des nombres aussi grands. Il y a probablement des astuces, mathématiques ou informatiques, pour réduire la taille des nombres à calculer.

    Tyrtamos

  5. #5
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Réponse purement technique : Ne serait-il pas judicieux pour ce genre de fonctions de les faire en C ? et de faire un wrap avec Swig ensuite ? Cela permettrait de profiter de la vitesse d'exécution du C dans python.

    En plus, si tu utilises gmp depuis C, la boucle sera bouclée.
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

Discussions similaires

  1. Optimisation d'une fonction non convexe
    Par Kevin_18 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 06/08/2008, 09h40
  2. Optimisation d'une fonction de découpage en sous-chaine
    Par FabaCoeur dans le forum Général Java
    Réponses: 9
    Dernier message: 05/01/2008, 14h00
  3. Optimisation d'une fonction
    Par BNS dans le forum C++
    Réponses: 7
    Dernier message: 15/12/2007, 22h25
  4. Afficher une fonction du temps
    Par Benjikos dans le forum Signal
    Réponses: 1
    Dernier message: 13/11/2007, 23h50
  5. Réponses: 6
    Dernier message: 27/06/2007, 16h44

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