Aller au contenu
> đŸ’» 🧠 Code 1001 > 📚 Supports d'Apprentissage > 🐍 Python > 📘 Collections en Python

📘 Collections en Python

Les collections supportent généralement :

  • l’itĂ©ration (for item in collection)
  • les tests d’appartenance (x in collection)
  • la dĂ©termination de la longueur (len(collection))
  • l’accĂšs par index ou clĂ© (si ordonnĂ© ou associatif)

Python n’a pas d’« interface collection » stricte, mais suit des protocoles informels. Si un objet implĂ©mente __iter__, __len__, __contains__, il peut ĂȘtre considĂ©rĂ© comme une collection.


Ce qui N’EST PAS une collection

Les types suivants ne sont pas des collections, car ils ne contiennent pas de groupes d’élĂ©ments :

  • int, float, bool — valeurs scalaires
  • None — absence de valeur
  • fonctions, modules, classes — ce sont des objets, mais pas des conteneurs de donnĂ©es (sauf s’ils contiennent __dict__)

Collections intégrées

Disponibles sans import :

TypeDescription
listSéquence ordonnée, mutable.
tupleSéquence ordonnée, immuable.
dictMappage clé-valeur ordonné (depuis Python 3.7).
setCollection non ordonnĂ©e d’élĂ©ments uniques.
frozensetVersion immuable de set.

Collections étendues de la bibliothÚque standard

TypeModuleUtilité
SimpleNamespacetypesObjet avec attributs dynamiques (alternative au dict avec accĂšs par .).
namedtuplecollectionsTuple immuable avec champs nommés.
dequecollectionsFile doublement terminĂ©e — efficace pour ajouts/retraits aux deux extrĂ©mitĂ©s.
CountercollectionsSous-classe de dict pour compter les objets hachables.
defaultdictcollectionsDictionnaire avec valeurs par défaut pour les clés manquantes.
dataclassdataclassesGénÚre automatiquement __init__, __repr__, __eq__, etc.
UserListcollectionsClasse de base pour objets de type liste personnalisés.
UserDictcollectionsClasse de base pour objets de type dictionnaire personnalisés.

Autres types similaires aux collections

Bien qu’on ne les appelle pas toujours « collections », ces types reprĂ©sentent ou stockent aussi des groupes de donnĂ©es.

1. str — chaüne de caractùres

Séquence ordonnée, immuable de caractÚres.

s = "Python"
print(len(s))        # → 6
print(s[0])          # → P
print('y' in s)      # → True
print(list(s))       # → ['P', 'y', 't', 'h', 'o', 'n']

2. bytes, bytearray

  • bytes — sĂ©quence immuable d’octets.
  • bytearray — version mutable.
b = b"bonjour"
print(b[0])          # → 98
print(len(b))        # → 7

ba = bytearray(b"bonjour")
ba[0] = 72
print(ba)            # → bytearray(b'Hello')

3. range

Séquence numérique paresseuse, ordonnée. Ne stocke pas les éléments en mémoire.

r = range(3)
print(list(r))       # → [0, 1, 2]
print(1 in r)        # → True
print(r[2])          # → 2

4. array.array

Stocke des données numériques homogÚnes de façon compacte (comme en C).

from array import array
arr = array('i', [1, 2, 3])  # 'i' = entier signé
print(arr)                   # → array('i', [1, 2, 3])

5. Générateurs et itérateurs

Ne stockent pas les donnĂ©es — les gĂ©nĂšrent Ă  la demande. Ne supportent pas len() ni l’indexation.

gen = (x * 2 for x in range(3))
print(list(gen))     # → [0, 2, 4]
# len(gen) → TypeError

6. ChainMap (de collections)

Regroupe plusieurs dictionnaires en une seule vue — la recherche parcourt les maps dans l’ordre.

from collections import ChainMap

d1 = {'a': 1}
d2 = {'b': 2}
cm = ChainMap(d1, d2)
print(cm['a'])       # → 1
print(cm['b'])       # → 2

7. OrderedDict (de collections)

Dictionnaire qui conserve l’ordre d’insertion. Pertinent pour Python < 3.7.

from collections import OrderedDict

od = OrderedDict([('a', 1), ('b', 2)])
print(od)            # → OrderedDict([('a', 1), ('b', 2)])

8. enum.Enum, enum.Flag

Collections de constantes nommées.

from enum import Enum
class Couleur(Enum):
    ROUGE = 1
    VERT = 2
print(list(Couleur))   # → [<Couleur.ROUGE: 1>, <Couleur.VERT: 2>]

9. typing.NamedTuple, typing.TypedDict

Enveloppes typées autour de namedtuple et dict.

from typing import NamedTuple, TypedDict

class Personne(NamedTuple):
    nom: str
    age: int

p = Personne("Alice", 25)

class Film(TypedDict):
    titre: str
    annee: int

m: Film = {"titre": "Matrix", "annee": 1999}

10. heapq, bisect — outils, pas collections

Travaillent avec des collections, mais n’en sont pas :

  • heapq — algorithme de file de prioritĂ© via listes.
  • bisect — maintient l’ordre triĂ© dans les listes.

1. Listes — list

Collection ordonnée, mutable. Les éléments peuvent se répéter, tous types autorisés.

UtilisĂ©e quand on a besoin d’une sĂ©quence flexible : ajouter, supprimer, modifier des Ă©lĂ©ments.

Création : []

jean_list = ["Jean", "Paris", 30, "ingénieur"]
print(f"Création liste : {jean_list}")
# → CrĂ©ation liste : ['Jean', 'Paris', 30, 'ingĂ©nieur']

print(f"ÉlĂ©ment Ă  l’index 0 : {jean_list[0]}")
# → ÉlĂ©ment Ă  l’index 0 : Jean

jean_list[2] = 31
print(f"AprĂšs modification : {jean_list}")
# → AprĂšs modification : ['Jean', 'Paris', 31, 'ingĂ©nieur']

jean_list.append("marié")
print(f"AprĂšs append : {jean_list}")
# → AprĂšs append : ['Jean', 'Paris', 31, 'ingĂ©nieur', 'mariĂ©']

jean_list.insert(1, "France")
print(f"AprĂšs insert : {jean_list}")
# → AprĂšs insert : ['Jean', 'France', 'Paris', 31, 'ingĂ©nieur', 'mariĂ©']

jean_list.remove("ingénieur")
print(f"AprĂšs remove par valeur : {jean_list}")
# → AprĂšs remove par valeur : ['Jean', 'France', 'Paris', 31, 'mariĂ©']

del jean_list[2]
print(f"AprĂšs suppression par index : {jean_list}")
# → AprĂšs suppression par index : ['Jean', 'France', 31, 'mariĂ©']

jean_list.extend(["loisirs", "pĂȘche"])
print(f"AprĂšs extend : {jean_list}")
# → AprĂšs extend : ['Jean', 'France', 31, 'mariĂ©', 'loisirs', 'pĂȘche']

jean_list.pop()
print(f"AprĂšs pop : {jean_list}")
# → AprĂšs pop : ['Jean', 'France', 31, 'mariĂ©', 'loisirs']

2. Dictionnaires — dict

Collection de paires clĂ© → valeur. Les clĂ©s doivent ĂȘtre hachables. Depuis Python 3.7, l’ordre d’insertion est conservĂ©.

Utile pour les données structurées : profils, configs, JSON.

Création : {}

alice_dict = {"nom": "Alice", "age": 25, "ville": "Lyon", "profession": "artiste"}
print(f"Création dict : {alice_dict}")
# → CrĂ©ation dict : {'nom': 'Alice', 'age': 25, 'ville': 'Lyon', 'profession': 'artiste'}

print(f"Valeur pour clé 'nom' : {alice_dict['nom']}")
# → Valeur pour clĂ© 'nom' : Alice

alice_dict["age"] = 26
print(f"AprĂšs mise Ă  jour : {alice_dict}")
# → Aprùs mise à jour : {'nom': 'Alice', 'age': 26, 'ville': 'Lyon', 'profession': 'artiste'}

alice_dict["hobby"] = "peinture"
print(f"Ajout paire : {alice_dict}")
# → Ajout paire : {'nom': 'Alice', 'age': 26, 'ville': 'Lyon', 'profession': 'artiste', 'hobby': 'peinture'}

del alice_dict["ville"]
print(f"AprĂšs suppression paire : {alice_dict}")
# → Aprùs suppression paire : {'nom': 'Alice', 'age': 26, 'profession': 'artiste', 'hobby': 'peinture'}

hobby = alice_dict.pop("hobby")
print(f"AprĂšs pop : {alice_dict}, valeur : {hobby}")
# → Aprùs pop : {'nom': 'Alice', 'age': 26, 'profession': 'artiste'}, valeur : peinture

print(f"Clé 'nom' existe : {'nom' in alice_dict}")
# → ClĂ© 'nom' existe : True

3. Tuples — tuple

Collection ordonnée, immuable. Adaptée aux données fixes.

UtilisĂ©e quand l’immuabilitĂ© est importante : coordonnĂ©es, paramĂštres, valeurs de retour.

Création : ()

jean_tuple = ("Jean", "Paris", 30, "ingénieur")
print(f"Création tuple : {jean_tuple}")
# → CrĂ©ation tuple : ('Jean', 'Paris', 30, 'ingĂ©nieur')

print(f"ÉlĂ©ment Ă  l’index 2 : {jean_tuple[2]}")
# → ÉlĂ©ment Ă  l’index 2 : 30

# jean_tuple[0] = "Pierre"  → TypeError
# jean_tuple.append("quelque chose") → AttributeError
  • Les tuples consomment moins de mĂ©moire et sont plus rapides que les listes.
  • IdĂ©al quand la mutabilitĂ© n’est pas nĂ©cessaire.

4. SimpleNamespace

Classe simple de types pour créer des objets avec attributs dynamiques. AccÚs via la notation pointée (obj.attr).

Utile quand on veut la syntaxe obj.nom sans définir une classe complÚte.

from types import SimpleNamespace

alice_ns = SimpleNamespace(nom="Alice", age=25, ville="Lyon")
print(f"Objet : {alice_ns}")
# → Objet : namespace(nom='Alice', age=25, ville='Lyon')

print(f"Nom : {alice_ns.nom}")
# → Nom : Alice

alice_ns.age = 26
print(f"AprĂšs mise Ă  jour : {alice_ns}")
# → Aprùs mise à jour : namespace(nom='Alice', age=26, ville='Lyon')

alice_ns.profession = "artiste"
print(f"Avec nouvel attribut : {alice_ns}")
# → Avec nouvel attribut : namespace(nom='Alice', age=26, ville='Lyon', profession='artiste')

del alice_ns.ville
print(f"AprĂšs suppression : {alice_ns}")
# → Aprùs suppression : namespace(nom='Alice', age=26, profession='artiste')

setattr(alice_ns, "hobby", "peinture")
print(f"Via setattr : {alice_ns}")
# → Via setattr : namespace(nom='Alice', age=26, profession='artiste', hobby='peinture')

delattr(alice_ns, "hobby")
print(f"Via delattr : {alice_ns}")
# → Via delattr : namespace(nom='Alice', age=26, profession='artiste')
  • Alternative au dict quand obj.nom est prĂ©fĂ©rable Ă  obj['nom'].

5. Ensembles — set

Collection non ordonnĂ©e d’élĂ©ments uniques. Supporte les opĂ©rations ensemblistes : union, intersection, diffĂ©rence.

UtilisĂ©e pour supprimer les doublons et tester l’appartenance.

Création : {} ou set()

nombres = {1, 2, 3, 3, 2, 1}
print(f"Ensemble : {nombres}")
# → Ensemble : {1, 2, 3}

nombres.add(4)
print(f"AprĂšs ajout : {nombres}")
# → Aprùs ajout : {1, 2, 3, 4}

nombres.remove(2)
print(f"AprĂšs suppression : {nombres}")
# → Aprùs suppression : {1, 3, 4}

autre = {3, 4, 5}
print(f"Union : {nombres | autre}")
# → Union : {1, 3, 4, 5}

print(f"Intersection : {nombres & autre}")
# → Intersection : {3, 4}

print(f"Différence : {nombres - autre}")
# → DiffĂ©rence : {1}

6. Ensembles immuables — frozenset

Version immuable de set. Peut ĂȘtre utilisĂ© comme clĂ© de dict ou Ă©lĂ©ment d’un autre ensemble.

frozen = frozenset([1, 2, 3, 2])
print(f"frozenset : {frozen}")
# → frozenset : frozenset({1, 2, 3})

autre = frozenset([3, 4])
print(f"Intersection : {frozen & autre}")
# → Intersection : frozenset({3})

print(f"Union : {frozen | autre}")
# → Union : frozenset({1, 2, 3, 4})

# frozen.add(5) → AttributeError

7. namedtuple — tuples nommĂ©s

Structure immuable avec accĂšs par nom de champ. Plus lisible que les tuples classiques.

from collections import namedtuple

Personne = namedtuple("Personne", ["nom", "age", "ville"])
alice = Personne("Alice", 25, "Lyon")

print(f"Objet : {alice}")
# → Objet : Personne(nom='Alice', age=25, ville='Lyon')

print(f"Nom : {alice.nom}")
# → Nom : Alice

print(f"Âge : {alice[1]}")
# → Âge : 25

# alice.age = 26 → AttributeError

alice_new = alice._replace(age=26)
print(f"Copie modifiée : {alice_new}")
# → Copie modifiĂ©e : Personne(nom='Alice', age=26, ville='Lyon')
  • IdĂ©al pour les enregistrements : points, utilisateurs, configs — quand l’immuabilitĂ© et la lisibilitĂ© comptent.

8. deque — file double

Optimisée pour les ajouts/retraits rapides aux deux extrémités. Plus efficace que list pour appendleft, popleft.

from collections import deque

d = deque([1, 2, 3])
print(f"deque initial : {d}")
# → deque initial : deque([1, 2, 3])

d.appendleft(0)
print(f"AprĂšs appendleft : {d}")
# → Aprùs appendleft : deque([0, 1, 2, 3])

d.append(4)
print(f"AprĂšs append : {d}")
# → Aprùs append : deque([0, 1, 2, 3, 4])

gauche = d.popleft()
print(f"AprĂšs popleft : {gauche}, restant : {d}")
# → Aprùs popleft : 0, restant : deque([1, 2, 3, 4])

droite = d.pop()
print(f"AprĂšs pop : {droite}, restant : {d}")
# → Aprùs pop : 4, restant : deque([1, 2, 3])
  • UtilisĂ© dans les algorithmes : BFS, caches LRU, tampons — quand les opĂ©rations aux extrĂ©mitĂ©s doivent ĂȘtre rapides.

9. Counter — compteur d’élĂ©ments

Compte la frĂ©quence des Ă©lĂ©ments dans un itĂ©rable. Utile pour les statistiques et l’analyse.

from collections import Counter

texte = "abracadabra"
c = Counter(texte)
print(f"Comptage lettres : {c}")
# → Comptage lettres : Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})

print(f"Fréquence de 'a' : {c['a']}")
# → FrĂ©quence de 'a' : 5

print(f"Top 3 : {c.most_common(3)}")
# → Top 3 : [('a', 5), ('b', 2), ('r', 2)]

c2 = Counter("bukva")
c.update(c2)
print(f"AprĂšs update : {c}")
# → Aprùs update : Counter({'a': 6, 'b': 3, 'r': 2, 'c': 1, 'd': 1, 'u': 1, 'k': 1, 'v': 1})
  • Utile pour l’analyse de texte, logs, votes — partout oĂč il faut compter « ce qui apparaĂźt le plus souvent ».

10. defaultdict — dictionnaire avec valeurs par dĂ©faut

CrĂ©e automatiquement des valeurs par dĂ©faut pour les clĂ©s manquantes. Élimine les vĂ©rifications if key in dict.

from collections import defaultdict

dd_list = defaultdict(list)
dd_list["fruits"].append("pomme")
dd_list["fruits"].append("banane")
print(f"Liste : {dict(dd_list)}")
# → Liste : {'fruits': ['pomme', 'banane']}

dd_int = defaultdict(int)
for char in "abracadabra":
    dd_int[char] += 1
print(f"Comptages : {dict(dd_int)}")
# → Comptages : {'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}

dd_set = defaultdict(set)
dd_set["villes"].add("Paris")
dd_set["villes"].add("Lyon")
print(f"Ensemble : {dict(dd_set)}")
# → Ensemble : {'villes': {'Paris', 'Lyon'}}
  • Élimine le code rĂ©pĂ©titif comme if key not in d: d[key] = [].
  • Rend le code plus propre et plus sĂ»r.

11. dataclass — classes de donnĂ©es

Décorateur qui génÚre automatiquement __init__, __repr__, __eq__, etc.

from dataclasses import dataclass

@dataclass
class Personne:
    nom: str
    age: int
    ville: str = "Non spécifiée"

alice = Personne("Alice", 25)
print(f"Objet : {alice}")
# → Objet : Personne(nom='Alice', age=25, ville='Non spĂ©cifiĂ©e')

print(f"Nom : {alice.nom}")
# → Nom : Alice

alice.age = 26
print(f"AprĂšs mise Ă  jour : {alice}")
# → AprĂšs mise Ă  jour : Personne(nom='Alice', age=26, ville='Non spĂ©cifiĂ©e')

bob = Personne("Bob", 30)
print(f"Alice == Bob : {alice == bob}")
# → Alice == Bob : False

@dataclass(frozen=True)
class PersonneImmutable:
    nom: str
    age: int

ivan = PersonneImmutable("Ivan", 40)
# ivan.age = 41 → FrozenInstanceError
  • Remplace l’écriture manuelle de __init__, __repr__, __eq__.
  • IdĂ©al pour les DTO, configs, modĂšles.

12. UserList — listes personnalisĂ©es

Hérite de collections.UserList. Utilisé pour créer des listes avec comportement personnalisé.

from collections import UserList

class ListeAvecLogs(UserList):
    def append(self, item):
        print(f"[LOG] Ajout : {item}")
        super().append(item)

    def remove(self, item):
        print(f"[LOG] Suppression : {item}")
        super().remove(item)

log_list = ListeAvecLogs([1, 2, 3])
print(f"Initial : {log_list}")
# → Initial : [1, 2, 3]

log_list.append(4)
# → [LOG] Ajout : 4
print(f"AprĂšs append : {log_list}")
# → Aprùs append : [1, 2, 3, 4]

log_list.remove(2)
# → [LOG] Suppression : 2
print(f"AprĂšs remove : {log_list}")
# → Aprùs remove : [1, 3, 4]
  • Utile pour ajouter des logs, validations, ou modifier le comportement standard des listes.

13. UserDict — dictionnaires personnalisĂ©s

Hérite de collections.UserDict. Utilisé pour créer des dicts avec comportement personnalisé.

from collections import UserDict

class DictClefsMinuscules(UserDict):
    def __setitem__(self, key, value):
        key = key.lower() if isinstance(key, str) else key
        super().__setitem__(key, value)

    def __getitem__(self, key):
        key = key.lower() if isinstance(key, str) else key
        return super().__getitem__(key)

ld = DictClefsMinuscules()
ld["Nom"] = "Alice"
print(f"Valeur pour 'Nom' : {ld['Nom']}")
# → Valeur pour 'Nom' : Alice
print(f"Valeur pour 'nom' : {ld['nom']}")
# → Valeur pour 'nom' : Alice
print(f"Clés : {list(ld.keys())}")
# → ClĂ©s : ['nom']
  • UtilisĂ© pour normaliser les clĂ©s, valider, logger, mettre en cache, etc.

📈 Comparaison mĂ©moire et performance

Le choix de la collection impacte performance et consommation mémoire. Voici des benchmarks pratiques.


1. Mémoire : list vs tuple vs array.array

import sys
from array import array

n = 1_000_000
data = list(range(n))
data_t = tuple(range(n))
data_a = array('i', range(n))

print(f"list :  {sys.getsizeof(data) / 1024 / 1024:.2f} Mo")
# → list :  8.00 Mo

print(f"tuple : {sys.getsizeof(data_t) / 1024 / 1024:.2f} Mo")
# → tuple : 8.00 Mo

print(f"array : {sys.getsizeof(data_a) / 1024 / 1024:.2f} Mo")
# → array : 3.81 Mo
  • array.array utilise ~2x moins de mĂ©moire pour les nombres.
  • list et tuple consomment une mĂ©moire similaire, mais tuple est lĂ©gĂšrement plus rapide en itĂ©ration.

2. Vitesse d’accùs : list vs tuple vs array.array

import time

def time_access(collection, name):
    start = time.perf_counter()
    total = 0
    for i in range(len(collection)):
        total += collection[i]
    end = time.perf_counter()
    print(f"{name} : {end - start:.4f} secondes")

n = 10_000_000
lst = list(range(n))
tpl = tuple(range(n))
arr = array('i', range(n))

time_access(lst, "list")   # → list : 1.2000 secondes
time_access(tpl, "tuple")  # → tuple : 1.0000 secondes
time_access(arr, "array")  # → array : 0.8000 secondes
  • array.array est le plus rapide pour les donnĂ©es numĂ©riques.
  • tuple est 10–20% plus rapide que list.
  • La diffĂ©rence est notable Ă  grande Ă©chelle.

3. Mémoire : dict vs SimpleNamespace vs dataclass

d = {"nom": "A", "age": 25, "ville": "X", "hobby": "Y", "job": "Z"}
ns = SimpleNamespace(nom="A", age=25, ville="X", hobby="Y", job="Z")
dc = PersonneDC("A", 25, "X", "Y", "Z")

print(f"dict :      {sys.getsizeof(d)} octets")          # → 232
print(f"SimpleNamespace : {sys.getsizeof(ns)} octets")   # → 64
print(f"dataclass : {sys.getsizeof(dc)} octets")         # → 64
print(f"ns.__dict__ : {sys.getsizeof(ns.__dict__)} octets")  # → 232
  • SimpleNamespace et dataclass consomment autant de mĂ©moire que dict Ă  cause de __dict__.
  • Utilisez __slots__ pour Ă©conomiser de la mĂ©moire.

4. Optimisation mémoire : dataclass avec __slots__

@dataclass
class PersonneSlots:
    __slots__ = ("nom", "age", "ville", "hobby", "job")
    nom: str
    age: int
    ville: str
    hobby: str
    job: str

dc_slots = PersonneSlots("A", 25, "X", "Y", "Z")
print(f"dataclass + slots : {sys.getsizeof(dc_slots)} octets")
# → 80 octets

# dc_slots.new = "valeur" → AttributeError
  • __slots__ Ă©conomise de la mĂ©moire et accĂ©lĂšre l’accĂšs aux attributs.
  • Contrepartie : pas d’ajout d’attributs dynamiques.

5. Vitesse de recherche : list vs set

n = 1_000_000
lst = list(range(n))
st = set(range(n))

def time_in(collection, target, name):
    start = time.perf_counter()
    for _ in range(1000):
        _ = target in collection
    end = time.perf_counter()
    print(f"{name} (recherche {target}) : {end - start:.4f} secondes")

time_in(lst, 999_999, "list")   # → 10.0000 secondes
time_in(st, 999_999, "set")     # → 0.0005 secondes
  • set est des milliers de fois plus rapide que list pour les tests d’appartenance.
  • Toujours utiliser set pour les vĂ©rifications frĂ©quentes de x in collection.

6. Mémoire : set vs frozenset

s = set(range(1000))
fs = frozenset(range(1000))

print(f"set :       {sys.getsizeof(s)} octets")     # → 32792
print(f"frozenset : {sys.getsizeof(fs)} octets")   # → 32792
  • frozenset et set consomment une mĂ©moire identique.
  • La diffĂ©rence est uniquement la mutabilitĂ©.

7. Vitesse d’ajout : list.append vs deque.append vs deque.appendleft

from collections import deque
import time

def time_append(collection, n, method='append'):
    start = time.perf_counter()
    for i in range(n):
        if method == 'appendleft' and hasattr(collection, 'appendleft'):
            collection.appendleft(i)
        else:
            collection.append(i)
    end = time.perf_counter()
    return end - start

n = 100_000

lst = []
dq = deque()

time_list_append = time_append(lst, n)              # → 0.0100 secondes
time_deque_append = time_append(dq, n)              # → 0.0100 secondes
time_deque_appendleft = time_append(deque(), n, 'appendleft')  # → 0.0100 secondes

# list.insert(0):
lst = []
start = time.perf_counter()
for i in range(n):
    lst.insert(0, i)
end = time.perf_counter()
print(f"list.insert(0) :   {end - start:.4f} secondes")   # → 5.0000 secondes
  • deque.appendleft est en O(1), contrairement Ă  list.insert(0) qui est en O(n).
  • Utilisez deque pour les opĂ©rations frĂ©quentes aux deux extrĂ©mitĂ©s.

🧠 Recommandations de performance

SituationUtiliserRaison
Stocker des nombres, mémoire critiquearray.array2x moins de mémoire, accÚs plus rapide
Données immuablestuplePlus rapide que list, plus sûr
Vérifications fréquentes x in collectionset / frozensetO(1) contre O(n) pour list
Opérations aux deux extrémitésdequeappendleft/popleft en O(1)
Données structurées, mémoire critiquedataclass + __slots__Pas de __dict__, moins de mémoire
Compter les fréquencesCounterOptimisé pour cette tùche
Comportement personnaliséUserList / UserDictExtension sûre des collections intégrées

📊 Comparaison des collections

TypeOrdonnĂ©MutableÉlĂ©ments uniquesAccĂšs indexDoublons
list✅ Oui✅ Oui❌ Non✅ Oui✅ Oui
tuple✅ Oui❌ Non❌ Non✅ Oui✅ Oui
dict✅ Oui*✅ OuiClĂ©s uniquement❌ NonValeurs : ✅
set❌ Non✅ Oui✅ Oui❌ Non❌ Non
frozenset❌ Non❌ Non✅ Oui❌ Non❌ Non
SimpleNamespace✅ Oui (attrs)✅ Oui❌ Non (attrs peuvent se rĂ©pĂ©ter sĂ©mantiquement)❌ Non✅ Oui
namedtuple✅ Oui❌ Non❌ Non✅ Oui✅ Oui
deque✅ Oui✅ Oui❌ Non✅ Oui✅ Oui
Counter❌ Non✅ Oui❌ Non❌ Non (mais a des clĂ©s)✅ Oui
defaultdict✅ Oui*✅ OuiClĂ©s uniquement❌ NonValeurs : ✅
dataclass✅ Oui (champs)✅ Oui (si non gelĂ©)❌ Non❌ Non✅ Oui
UserList✅ Oui✅ Oui❌ Non✅ Oui✅ Oui
UserDict✅ Oui*✅ OuiClĂ©s uniquement❌ NonValeurs : ✅
str✅ Oui❌ Non❌ Non✅ Oui✅ Oui
bytes✅ Oui❌ Non❌ Non✅ Oui✅ Oui
bytearray✅ Oui✅ Oui❌ Non✅ Oui✅ Oui
range✅ Oui❌ Non❌ Non✅ Oui❌ Non
array.array✅ Oui✅ Oui❌ Non✅ Oui✅ Oui
ChainMap✅ Oui*✅ OuiClĂ©s uniquement❌ NonValeurs : ✅
Enum✅ Oui❌ Non✅ Oui (membres)❌ Non❌ Non
  • — depuis Python 3.7, dict, defaultdict, UserDict, ChainMap conservent l’ordre d’insertion.

💡 Quand utiliser quoi ?

TĂącheCollection
Séquence mutablelist / deque / UserList / bytearray
Données immuablestuple / namedtuple / frozenset / str / bytes
Recherche rapide, suppression doublonsset / frozenset
Données structuréesdict / dataclass / SimpleNamespace / UserDict / TypedDict
Utilisable comme clé de dictfrozenset
Objets temporaires avec accĂšs par .SimpleNamespace / dataclass
Compter les fréquencesCounter
Valeurs par défaut pour clésdefaultdict
Opérations efficaces aux extrémitésdeque
Comportement de liste personnaliséUserList
Comportement de dict personnaliséUserDict
Données binairesbytes / bytearray / array.array
Configs avec hiérarchieChainMap
Constantes nomméesEnum
Séquences paresseusesrange / générateurs

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *