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 :

Comparaison vitesse algo


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pologne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2016
    Messages : 26
    Points : 28
    Points
    28
    Par défaut Comparaison vitesse algo
    Bonjour,

    Je suis en train de m'amuser à comparer la vitesse de différentes fonctions Python. Pour cela, j'ai écrit deux fonctions qui calculent les nombres premiers dans un intervalle de 1 à x. Bizarrement, les résultats vont à l'encontre de ce à quoi je m'attendais:

    La première fonction, bête et méchante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def prime1(x):
    	a = time.time()
    	liste = []
    	for i in range(1, x+1):
    		for j in range(2, i+1):
    			if i % j == 0 and i != j: break
    			else:
    				if j == i: liste.append(i)
    	b = time.time()
    	print b - a
    La deuxième, implémente le crible d'Erathostène:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def prime2(x):
    	a = time.time()
    	liste = range(1,x+1,2)
    	for i in range(2, x+1):
    		liste = filter( lambda x: x % i != 0 or x == i, liste)
    	b = time.time()
    	print b - a
    Intuitivement, je pensais que la seconde version sera beaucoup plus rapide, d'autant plus que l'on évite de vérifier tous les nombres pairs avec le range(1, x+1, 2) et que la fonction filter, implémentée en C est censée être plus rapide, et pourant:

    >>> prime1(10000)
    1.21399998665
    >>> prime2(10000)
    2.10899996758
    >>> prime1(100000)
    106.244999886
    >>> prime2(100000)
    167.480000019

    Mais là où je suis encore plus étonné, c'est qu'en remplaçant les deux "range" par des "xrange", censés être plus économiques, la fonction prime2 n'accélère pas, voire parfois est légèrement encore plus lente....
    Quelqu'un aurait-il une explication ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par JacekB Voir le message
    Intuitivement, je pensais que la seconde version sera beaucoup plus rapide, d'autant plus que l'on évite de vérifier tous les nombres pairs avec le range(1, x+1, 2) et que la fonction filter, implémentée en C est censée être plus rapide.
    Vous appelez .append pour ajouter un nombre premier à une liste, vous appelez filter + lambda beaucoup plus souvent.

    Citation Envoyé par JacekB Voir le message
    Mais là où je suis encore plus étonné, c'est qu'en remplaçant les deux "range" par des "xrange", censés être plus économiques, la fonction prime2 n'accélère pas, voire parfois est légèrement encore plus lente....
    La différence entre range et xrange est plutôt "économie" de mémoire utilisée (on crée la liste avant d'iterer avec range, on génére les nombres au fur et à mesure avec xrange) dont le bénéfice (l'overhead de l'allocation de la mémoire) n'est visible que lorsque N est (très) grand.

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

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    j'ajouterai que dans prime2(), si x=4 par exemple, tu vas vérifier la totalité des nombres i de la liste, comme 4 % 75341 par exemple, là où dans prime1 ta boucle n'allait pour chaque nombre que jusqu'à x+1 (donc 5 dans l'exemple), m'est avis que la lenteur vient de là.

    Edit: d'ailleurs à mieux y regarder, ton implémentation du crible est complètement fausse et la fonction ne calcule pas ce qu'elle devrait

Discussions similaires

  1. Comparaison entre les algos des tri
    Par Black.Rose dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 11/12/2008, 20h55
  2. Algo de comparaison approximative de chaînes
    Par Davboc dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/05/2007, 09h21
  3. Comparaison de la vitesse d’exécution
    Par layouni dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/09/2005, 15h43
  4. algo comparaison sequence
    Par MAROIS dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 12/04/2005, 11h29
  5. Peer to Peer (vitesse) comparaison ADSL et Câble
    Par rigel dans le forum Développement
    Réponses: 4
    Dernier message: 22/09/2004, 21h56

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