CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Comparaison vitesses d'éxécutions algorithmes récursif et itératif en python

Info_maths
Info_maths
Niveau 4
04 février 2021 à 18:28:59

Mais je te remercie déjà beaucoup Azerban pour le temps que tu as pris pour moi !!

Azerban
Azerban
Niveau 16
04 février 2021 à 18:40:16

Bon déjà tu peux virer les start = time() en dehors des boucles for.

Sinon je viens de tester et ça fonctionne bien sous Linux. Je ne sais pas si c'est un problème lié à windows ou matplotlib. Éventuellement essaie de passer par windows subsystem for linux. Si ça fonctionne là, c'est peut être windows qui merde.

Tu n'as pas un message d'erreur ? Sinon mets des print(rec) et print(it) pour voir le contenu de tes listes. Mets aussi des print dans tes boucles for.

Azerban
Azerban
Niveau 16
04 février 2021 à 18:45:21

J'ai l'impression qu'il y a un problème avec l'affichage de tes ordonnées, les nombres sont beaucoup trop gros (0.02, 0.04, etc...). Du coup on ne voit pas les courbes car les temps réels sont beaucoup plus petits, ton graphique n'est pas à l'échelle.

Message édité le 04 février 2021 à 18:47:06 par Azerban
Azerban
Azerban
Niveau 16
04 février 2021 à 18:50:55

Enlève également cette ligne:

from __future__ import unicode_literals

Si tu exécutes ton code en python 3 tu n'en as plus besoin.

Azerban
Azerban
Niveau 16
04 février 2021 à 18:55:12

Rajoute cette ligne dans ton bloc à la fin :

plt.autoscale(enable=True, axis='both', tight=None)
ab = range(rep)
plt.plot(ab, rec, color="b", label="Version recursive")
plt.plot(ab, it, color="r", label="Version iterative")
plt.autoscale(enable=True, axis='both', tight=None)
plt.xticks(ab)  # Affichage de toutes les valeurs de x
plt.margins(x=0)  # Enlève la marge sur l'axe des abscisses
plt.ticklabel_format(style="plain")  # Enlève la notation scientifique
plt.legend(loc=2)  # Affichage de la légende en haut à gauche#
plt.show()
Info_maths
Info_maths
Niveau 4
05 février 2021 à 09:37:26

Désolé j'ai mis du temps à répondre car j'ai mis à jour spyder et anaconda puis les ai désinstallés et ça a pris pas mal de temps.
Après avoir suivi tes instructions j'ai obtenu ça :
https://image.noelshack.com/fichiers/2021/05/5/1612514071-capture18.png

Je n'ai jamais eu de message d'erreur pour répondre à ta question et, voici le code que j'ai rentré :

from time import time

import matplotlib.pyplot as plt

def Fibo(n):
    a, b = 0, 1
    for i in range(0, n):
        a, b = b, a + b
    return a


def Fibo_rec(n):
    if n <= 1:
        return n
    else:
        return(Fibo_rec(n-1) + Fibo_rec(n-2))


rep = 10
it = []

for k in range(0, rep):
    start = time()
    Fibo(k)  # Calculs des premiers termes de la suite#
    duration = time() - start
    it.append(duration)# Stockage des temps de calculs#
    print(it)

rec = []
for i in range(0, rep):
    start = time()
    Fibo_rec(i)
    duration = time() - start
    rec.append(duration)
    print(rec)


print("La liste finale récursive est :", rec)
print("La liste finale itérative est :", it)

ab = range(rep)
plt.autoscale(enable=True, axis='both', tight=None)
plt.plot(ab, rec, color="b", label="Version recursive")
plt.plot(ab, it, color="r", label="Version iterative")
plt.autoscale(enable=True, axis='both', tight=None)
plt.xticks(ab)  # Affichage de toutes les valeurs de x
plt.margins(x=0)  # Enlève la marge sur l'axe des abscisses
plt.ticklabel_format(style="plain")  # Enlève la notation scientifique
plt.legend(loc=2)  # Affichage de la légende en haut à gauche#
plt.show()
Info_maths
Info_maths
Niveau 4
05 février 2021 à 09:48:30

Il me semble que l'algo ne finit pas... car on a pas le retour à la ligne avec les ">>>" et je suis obligé de restart le shell :
https://image.noelshack.com/fichiers/2021/05/5/1612514541-capture19.png
Or on a en sortie que des listes composées de valeurs nulles donc ça veut dire que les valeurs calculées à partir des appels des deux fonctions ne sont pas calculées.
En essayant d'enlever le -start j'obtiens des valeurs non nulles a fortiori. Peut-être est-ce le module time() le problème car avec matplotlib je n'ai jamais eu ce genre d'embêtement alors que je l'utilise souvent.
Mais si tu me dis que le code marche de ton côté c'est qu'il y a un problème avec windows peut-être... Je vais essayer de passer par windows subsystem for linux.

Azerban
Azerban
Niveau 16
05 février 2021 à 09:53:47

Vraiment curieux comme problème. Si tu testes sous WSL, n'installe pas anaconda, passe directement par la version de Python installée dans la distribution ubuntu.

Azerban
Azerban
Niveau 16
05 février 2021 à 10:42:17

Bon essaie avec la méthode perf_counter du module time et non pas la méthode time. C'est peut être la méthode time.time() qui sous windows n'est pas aussi précise que sous Linux. Normalement perf_counter() est fait pour mesurer des laps de temps extrêmement courts. :

# https://www.jeuxvideo.com/forums/42-47-65632835-1-0-1-0-comparaison-vitesses-d-executions-algorithmes-recursif-et-iteratif-en-python.htm
# fibonacci_benchmarks.py

from time import perf_counter

import matplotlib.pyplot as plt


def Fibo(n):
    a, b = 0, 1
    for i in range(0, n):
        a, b = b, a + b
    return a


def Fibo_rec(n):
    if n <= 1:
        return n
    else:
        return(Fibo_rec(n-1) + Fibo_rec(n-2))


rep = 10

it = []

for k in range(0, rep):
    start = perf_counter()
    Fibo(k)  # Calculs des premiers termes de la suite#
    duration = perf_counter() - start
    it.append(duration)  # Stockage des temps de calculs#

rec = []
start = perf_counter()

for i in range(0, rep):
    start = perf_counter()
    Fibo_rec(i)
    duration = perf_counter() - start
    rec.append(duration)

ab = range(rep)
plt.plot(ab, rec, color="b", label="Version recursive")
plt.plot(ab, it, color="r", label="Version iterative")
plt.xticks(ab)
plt.margins(x=0)  # Enlève la marge sur l'axe des abscisse
plt.ticklabel_format(style="plain")  # Enlève la notation scientifique
plt.legend(loc=2)  # Affichage de la légende en haut à gauche#
plt.show()
Info_maths
Info_maths
Niveau 4
05 février 2021 à 10:46:04

Ca a marché avec ta méthode perf_counter !! Le problème vient bien du module time() alors ! Tu penses qu'il n'est juste pas très compatible avec windows ?

Azerban
Azerban
Niveau 16
05 février 2021 à 10:56:00

Le 05 février 2021 à 10:46:04 Info_maths a écrit :
Ca a marché avec ta méthode perf_counter !! Le problème vient bien du module time() alors ! Tu penses qu'il n'est juste pas très compatible avec windows ?

Non time fait partie de la bibliothèque standard de Python. En fait le problème vient de ce que la méthode time() renvoie le nombre de secondes depuis l'epoch time (1 janvier 1970). Sous Linux, la méthode renvoie un nombre flottant avec la partie entière qui correspond au nombre de secondes depuis le 1er janvier 1970 et la partie décimale une précision qui va jusqu'au nanosecondes. Sur windows, je pense que la méthode ne renvoie pas la partie décimale.

Par curiosité tape dans ton invite de commande et un shell python :

>>> import time
>>> time.time()

Et compare avec:

>>> time.perf_counter()

Moi j'ai ça :

1612518580.9726257

J'imagine que la précision sous Windows est plus faible. Il faut donc utiliser la méthode perf_counter() qui est justement faite pour mesurer des intervalles très petits.

J'aurais dû trouver la solution tout de suite (désolé de t'avoir fait perdre du temps pour rien).

Info_maths
Info_maths
Niveau 4
05 février 2021 à 11:18:43

J'ai lancé time() dans python, ça m'a donné ça : 1612519494.939634.
Ne t'excuses pas ! T'as pris beaucoup de temps pour résoudre ce problème et je t'en remercie ! Effectivement, ça diffère. Après comment savoir quelle valeur est la plus précise ? Car on est sur du calcul relatif par rapport à une date donnée.

Azerban
Azerban
Niveau 16
05 février 2021 à 11:24:46

Le 05 février 2021 à 11:18:43 Info_maths a écrit :
J'ai lancé time() dans python, ça m'a donné ça : 1612519494.939634.
Ne t'excuses pas ! T'as pris beaucoup de temps pour résoudre ce problème et je t'en remercie ! Effectivement, ça diffère. Après comment savoir quelle valeur est la plus précise ? Car on est sur du calcul relatif par rapport à une date donnée.

Effectivement, j'ai 7 décimales, tu en as 6. Pas suffisant pour mesurer le temps d'exécution des calculs.

Utilise perf_counter() qui compte le nombre de secondes depuis la mise en route de ton système (depuis que t'as démarré ton pc en gros) mais avec une précision bien plus grande.

Info_maths
Info_maths
Niveau 4
05 février 2021 à 11:32:03

D'accord ! En tout cas merci de ton aide !! Et sûrement à bientôt pour de nouveaux problèmes ! :rire:

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment