Résolue

Les performances

# Compréhension de liste # Performances

Bonjour je viens de terminer un exercice où je dois affecter les valeurs pairs d'une variable dans une autre variable.

nombres = range(51)
nombres_pairs = [i for i in nombres if i % 2 == 0]

Après avoir validé cet exo, j'ai regardé les solutions proposées par la communauté et j'en ai trouvé une très intéressante avec

nombres = range(51)
nombres_pairs = list(nombres[0::2])

Ma question se tourne du côté des performances, je sais qu'ici nous n'avons que 50 occurrences mais si jamais nous parlions d'une structure lourde, je voudrais savoir si la boucle "for" garde sa réputation gourmande en python et si tel est le cas, est-ce que cette seconde méthode qui prend quelques octets de moins se montre plus légères / rapide dans son exécution ?


Merci

Bonjour,


En fait tu peux utiliser le module time pour vérifier:

import time

start_1 = time.time()
nombres = range(1000000)
nombres_pairs = [i for i in nombres if i % 2 == 0]
print(time.time()-start_1)


start_2 = time.time()
nombres = range(1000000)
nombres_pairs = list(nombres[0::2])
print(time.time()-start_2)


Avec une valeur de 50 en effet les 2 méthodes vont être équivalentes, mais si tu augmentes la valeur tu verras que la boucle for prendra un peu plus de temps.


Salut Céline,


Alors oui par essence la boucle for pour créer une liste c'est plus gourmand. Pour optimiser tu peux utiliser les 'array' qui sont des objets du module numpy. En gros quand tu créés une liste avec un boucle for, à chaque itération, python doit trouver les espaces mémoires disponibles pour stocker les items supplémentaires de ta liste tout en gardant le lien entre chaque item. Pour accéder à l'item 2 il doit d'abord passer par l'item 0 qui "connait" l'adresse mémoire de l'item 1 qui à son tour "connait" l'adresse mémoire de l'item 2.


J'ai pas testé les différent temps mais pour un des trucs le plus rapide serait:


In [8]: import numpy as np

In [9]: nombres = range(51)

In [10]: pairs = np.where(np.array(nombres) % 2 == 0)


Salut Céline,


c'est bon pour toi ?

Merci à tous pour vos réponses :)

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.