La file (FIFO)

File d'attente et implémentation en Python

Un cas d'usage très concret : la file d'attente

Une imprimante partagée, un serveur web qui traite des requêtes, un jeu vidéo qui gère les actions des joueurs : dans tous ces cas, on utilise une file pour garantir que les demandes sont traitées dans l'ordre où elles sont arrivées, sans en « doubler » aucune. C'est le principe d'équité du FIFO.

Schéma : file d'attente à une caisse

Arrivees dans l'ordre : client1, client2, client3

file d'attente :
[client1]
[client1, client2]
[client1, client2, client3]

caissier traite client1 -> defiler client1
file restante : [client2, client3]
caissier traite client2 -> defiler client2
file restante : [client3]

Implémentation en Python avec une liste

class File:
    def __init__(self):
        self.elements = []

    def enfiler(self, valeur):
        self.elements.append(valeur)

    def defiler(self):
        if self.est_vide():
            raise IndexError("file vide")
        return self.elements.pop(0)

    def est_vide(self):
        return len(self.elements) == 0

f = File()
f.enfiler("A")
f.enfiler("B")
f.enfiler("C")
print(f.defiler())   # A
print(f.defiler())   # B
print(f.elements)    # ['C']

Piège classique

Avec une liste Python, enfiler (append) est rapide, mais defiler (pop(0)) doit décaler tous les éléments restants d'une case vers l'avant : c'est coûteux dès que la file devient grande, car chaque defiler() coûte alors un temps proportionnel au nombre d'éléments restants. En pratique, on préfère souvent collections.deque, conçue pour retirer efficacement en tête de file en temps constant, mais l'implémentation avec une simple liste reste parfaite pour comprendre le principe du FIFO avant d'optimiser.