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 :

temps d'exécution de mon code python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 1
    Par défaut temps d'exécution de mon code python
    Bonjour,
    Je ne sais pas si c'est le bon endroit pour publié cela.
    J'ai un calcule que je dois effectuer: je dois additionner tous les nombre premiers jusqu'à 2 millions. Donc, j'ai fait une fonction récursive (voir la pièce jointe). Cependant, après 995 récursion j'obtient une erreur "limite de récursion atteinte". Alors, j'ai arrangé une boucle for pour que je puisse me rendre à 2 millions en traitant tous les nombres. Cependant, mon temps d'exécution est énormément long... Cela fait 4h que j'attend et je suis rendu seulement à 1,5million.
    Est-ce que quelqu'un saurait comment modifier mon code pour diminué mon temps d'exécution? Ou bien existe-t-il un module qui aiderait à alléger mon code(ex: math?)?
    merci beaucoup.
    Images attachées Images attachées  

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    somme = sum([x for x in range(1, 2000001)])
     
    print(somme)

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par danielhagnoul Voir le message


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    somme = sum([x for x in range(1, 2000001)])
     
    print(somme)
    Salut,

    Je trouve ta conception des nombres premiers vraiment très permissive, un peu de rigueur, voyons.

  4. #4
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Je trouve ta conception des nombres premiers vraiment très permissive, un peu de rigueur, voyons.
    Citation Envoyé par miguelod
    [...] je dois additionner tous les nombre premiers jusqu'à 2 millions [...]
    Oops !

    Je suis désolé de cette mauvaise réponse, j'ai mal lu la première fois, où j'ai été trop vite, j'avais retenu "additionne tous les nombres jusqu'à 2 millions" !

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  5. #5
    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,

    Citation Envoyé par miguelod Voir le message
    Cela fait 4h que j'attend et je suis rendu seulement à 1,5million.
    Est-ce que quelqu'un saurait comment modifier mon code pour diminué mon temps d'exécution? Ou bien existe-t-il un module qui aiderait à alléger mon code(ex: math?)?
    Calculer les nombres premiers avec une fonction récursive n'est pas une bonne idée.
    Côté algo. un peu de recherche sur Internet vous indiquerait comment optimiser çà.

    Sinon, vous pouvez attendre que Tyrtamos passe dans le coin, il adore les nombres premiers et aime bien raconter ce qu'il a fait sur le sujet (mais comme il a déjà raconté çà maintes fois, en cherchant sur Internet vous trouveriez aussi).

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

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    En ces temps de grande entraide voici une proposition à moins de huit secondes:
    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
     
    from math import sqrt
    import time
     
    primes = [3, 5, 7, 11]
    num = 13
    start = time.time()
    while num < 2000000:
        max_ = sqrt(num)
        for p in primes:
            if p <= max_:
                if not num % p:
                    break
     
            else:
                primes.append(num)
                break
     
        num += 2
     
    primes.insert(0, 2)
    end = time.time() - start
    print("%s nombres premiers at %s" % (len(primes), end))  # --> 148933 nombres premiers at 7.520849704742432

  7. #7
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    Citation Envoyé par VinsS Voir le message
    En ces temps de grande entraide voici une proposition à moins de huit secondes:
    Joli, chez moi 4s avec votre code ! pour ma part ~15s (bon après moi je respecte l'énoncé )

    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
    import math
    import time
     
    start = time.time()
     
    sum_of_primes = 0
     
     
    for n in range(1, 2_000_000, 2):
    	sqrt_of_n = math.ceil(math.sqrt(n))
    	if any(n%i==0 for i in range(2, sqrt_of_n)):
    		sum_of_primes += n
     
    time_elapsed = time.time() - start
     
    print(f"{time_elapsed=}s")
    print(f"{sum_of_primes=}")
    time_elapsed=15.359041452407837s
    sum_of_primes=856957967889

    Je m'attendais pas à un facteur 4 quand même

    par contre comme on ne sais pas quel est le résultat attendu difficile de savoir si l'on est dans le juste

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    flapili, tu peux grandement améliorer ça.

    Ceci if any(n%i==0 for i in range(2, sqrt_of_n)): fait que tu vérifies la divisibilité de n par 3 puis 4 puis 5 puis 6 etc...
    Il ne faut vérifier la divisibilité que par les nombres premiers et uniquement eux, donc très peu de nombres en fait, d'où la raison de d'abord constituer la liste.

    La somme avec mon code: 142913828922

Discussions similaires

  1. Optimisation de temps d'exécution d'un Code VBA
    Par Adilleroy dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 26/07/2010, 13h16
  2. Réponses: 1
    Dernier message: 29/05/2008, 19h15
  3. Calcul du temps d'exécution d'un code
    Par phoque.r dans le forum MATLAB
    Réponses: 2
    Dernier message: 13/03/2008, 10h40
  4. Comment trouver le temps d'exécution d'un code?
    Par Renma2 dans le forum VB.NET
    Réponses: 14
    Dernier message: 03/10/2007, 20h20
  5. [Fait]Temps d'exécution d'un code
    Par JeremieT dans le forum Contribuez
    Réponses: 2
    Dernier message: 30/08/2006, 06h20

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