Contenu du cours
Techniques d'Optimisation en Python
Techniques d'Optimisation en Python
Listes et Tableaux NumPy
Choisir la bonne structure de données peut affecter de manière significative à la fois la vitesse et l'utilisation de la mémoire. Explorons d'abord les listes et comparons-les avec les tableaux NumPy pour comprendre quand et comment utiliser ces structures de données efficacement.
Liste
Une list
est l'un des types de données les plus couramment utilisés. Elle fonctionne comme un tableau dynamique, ce qui signifie que sa taille peut augmenter ou diminuer selon les besoins. Les listes sont polyvalentes, offrant un accès et une modification efficaces à des indices arbitraires. Cependant, des opérations comme l'insertion ou la suppression d'éléments, et la recherche d'un élément (vérification de l'appartenance), peuvent devenir lentes pour les grandes listes. L'exception est l'insertion ou la suppression à la fin de la liste, qui reste efficace quelle que soit la taille de la liste.
Il serait judicieux d'utiliser des listes dans les scénarios suivants :
- Vous avez besoin de données ordonnées ;
- Vous accédez fréquemment ou modifiez des éléments par index ;
- Vous devez stocker différents types de données (par exemple, entiers, chaînes ou objets personnalisés) ;
- Vous n'avez pas besoin de tests d'appartenance rapides ou d'insertion ou de suppression rapide au milieu de la liste.
my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
Tableau NumPy
Bien que les listes soient polyvalentes, elles ne sont pas les plus efficaces pour les opérations numériques à grande échelle. C'est là que les tableaux NumPy entrent en jeu.
Les tableaux NumPy sont implémentés en C, ce qui les rend beaucoup plus rapides que les listes pour les opérations numériques. Un facteur clé est la vectorisation, qui permet d'effectuer des opérations sur des tableaux entiers à la fois, sans avoir besoin de boucles explicites. Cela conduit à des gains de performance significatifs, surtout avec de grands ensembles de données.
Regardons un exemple de mise au carré de chaque élément dans une liste (en utilisant une for
boucle dans une compréhension de liste) et un tableau NumPy (en utilisant la vectorisation):
import numpy as np import os os.system('wget https://content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Comme vous pouvez le voir, l'avantage de performance des tableaux NumPy est assez évident.
Lorsqu'il s'agit de données numériques, les tableaux NumPy offrent un avantage de mémoire par rapport aux listes. Ils stockent les données réelles dans des blocs de mémoire contigus, les rendant plus efficaces, surtout pour les grands ensembles de données. Étant homogènes (même type de données), les tableaux NumPy évitent la surcharge des références d'objets.
En revanche, les listes sont hétérogènes, stockant des références à des objets dans une mémoire contiguë, avec les objets réels stockés ailleurs. Cette flexibilité introduit une surcharge de mémoire supplémentaire lors du travail avec des données numériques.
Pour résumer, le tableau suivant compare les listes avec les tableaux NumPy :
1. Vous développez un programme pour gérer une collection d'objets Sensor
(classe personnalisée), chacun contenant un timestamp
(chaîne) et une reading
(flottant). Le jeu de données va croître avec le temps, et des mises à jour fréquentes des lectures individuelles des capteurs sont nécessaires. Quelle structure de données serait le meilleur choix ?
2. Vous travaillez avec un grand ensemble de données numériques pour un projet d'apprentissage automatique. Quelle structure de données offrirait la performance la plus efficace pour cette tâche ?
3. Vous analysez des données de marché boursier, qui consistent en des valeurs numériques (prix) au fil du temps. Vous devez effectuer des calculs rapides, tels que trouver le prix moyen et appliquer des transformations mathématiques sur les données. Quelle structure de données choisiriez-vous ?
Merci pour vos commentaires !