Résolue

Temps d'exécution très proches entre les deux solutions sur mon ordinateur

# Optimisation # Performances

Juste une remarque sur les temps d'exécution qui sont très proches sur mon ordinateur avec des variations ? Optimisation Python ou performances de mon ordinateur(i7/32Go RAM) ?

a = time()

nombre_aleatoire = ''
for i in range(5000000):
    nombre_aleatoire += str(randint(0, 9999))
    nombre_aleatoire += '\n'
with open(fichier, 'w') as f:
    f.write(nombre_aleatoire)

b = time()

print('Temps d\'exécution: {}'.format(b - a))

Temps d’exécution: 4.840376615524292


a = time()

nombre_aleatoire = []
for i in range(5000000):
    nombre_aleatoire.append(str(randint(0, 9999)))
    # nombre_aleatoire += '\n'
with open(fichier, 'w') as f:
    f.write('\n'.join(nombre_aleatoire))

b = time()

print('Temps d\'exécution: {}'.format(b - a))

Temps d’exécution: 4.2761101722717285


Hello Daniel,


la différence de temps d'exécution est très faible. Je ne pense pas qu'on puisse parler d'optimisation pour quelques dixième de secondes de diff.


Sans regarder les temps d'exec, selon moi le premier script est plus efficace même si cela ne se traduit pas dans les temps d'exec (mais là encore la diff est trop faible pour que ce soit significatif). En effet dans le second script, tu ajoutes des éléments dans une liste, c'est plus gourmand en ressources. En effet, pour une liste, Python alloue un espace mémoire et stocke les éléments. L'ennui c'est que à chaque itération ta liste grandit et pour chaque itération Python doit réallouer un nouvel espace mémoire. Dans ton script c'est la même liste qui grandit à chaque itération mais dans la mémoire, c'est à chaque fois une nouvelle liste qui se créée.


Bref on rentre un peu dans le détail mais pour conclure, à ces niveaux de boucle (range(5000000)) ta différence temps d'exécution ne vient pas selon moi d'une optimisation de code mais plutôt tout simplement de la génération des nombres aléatoire peut être. Peut être que dans un cas tu as beaucoup de nombres aléatoire proches de 9999 qui prennent plus de bits pour être écrits, donc plus lourd, donc prend plus de temps ou vice versa. Ou alors un autre process dans ton pc intervient à des moment différents.


Bref quoiqu'il arrive je pense que même avec des scripts complétement identique, tu n'obtiendras pas le même temps d'exec.


J'espère que ça répond à ta question. Sinon n'hésites pas. A +


ps: belle config au passage =D

As-tu essayer de mesurer de manière répétée avec le module timeit de la bibliostandard. Une mesure unique n'est souvent avec time comme ici n'est souvent pas représentative.time.time() est très imprécises et pas adaptée pour ce type de mesures. Si tu tiens à utiliser le module time, il y a d'autres fonctions avec une résolution plus précise à l'intérieur (voir docs.python.org)


Merci à tous les deux pour vos réponses. Effectivement, j'ai lancé les scripts plusieurs fois et les temps d'exécution diffèrent à chaque fois de quelques dixièmes de secondes pour chaque script.


Mais ma remarque fait plutôt référence au temps indiqué par @Thibault dans l'exo avec la méthode 1 (qui est un copié/collé de l'exo)

"Le temps total de l'opération sur mon ordinateur avec cette méthode est d'environ 75 secondes."

Environ 15 fois plus rapide sur mon ordinateur.

Le but de l'exercice étant de montrer que l'utilisation d'un objet muable réduit le temps d'exécution et comme ce n'est pas vraiment le cas, ça me posait question mais ça ne m'empêchera pas de dormir ;-)


Je me permet de relancer le sujet car je viens de faire l'exercice et je penses que tu as lancé deux fois la même version du script.


Voilà les résultats que j'obtiens avec les deux scripts:


None



@Raphael tu as quoi comme config ?

i9 11900k 3,5GHz 32Go de RAM

Hello,


du coup vous avez besoins de plus d'eclaircissement ou les réponses plus haut vous conviennent ?

Pour les petits curieux concernant les performances, il est intéressant d'utiliser une compréhension de liste pour voir que le programme est un peu plus rapide tout en produisant le même résultat.


random_numbers = "\n".join([str(randint(0, 9999)) for _ in range(5000000)])



Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.