Vol. 9 — № 27
The Python Loop · KiosqueNewsstand
Blog  
Un atelier Python · Édition d'ApprentissageA Python Workshop · Learning Edition

Le prix de la recherche dynamique The price of dynamic lookup

Le Vol. VI a montré comment obj.attr cherche — instance, classe, MRO. Ce dernier numéro chiffre ce que cette recherche coûte réellement, dans la boucle la plus chaude d'un programme, et montre où la mettre en cache. La boucle de la série se referme ici : le dynamisme n'a jamais été gratuit, seulement invisible. Vol. VI showed how obj.attr searches — instance, class, MRO. This final issue puts a number on what that search actually costs, in a program's hottest loop, and shows where to cache it. The series' loop closes here: dynamism was never free, only invisible.

AudienceAudience
Dev qui a écrit self.x dix mille fois dans une boucle chaude et n'a jamais mesuré ce que ça coûtait Dev who's written self.x ten thousand times in a hot loop and never measured what it cost
Format
Self-paced
ChapitresChapters
5
Date
Juil 2026 Jul 2026
≈ 21 min ●●●● PerformanceAttribute lookup__slots__

Chapitre 1 en accès libre — la suite (ch. 2 à 5) est réservée. Chapter 1 free to read — the rest (ch. 2–5) is members-only.

01CadrageFraming3 min

obj.attr n'est jamais un décalage mémoire — c'est une recherche, au mieux mise en cache, jamais supprimée.obj.attr is never a memory offset — it's a search, cached at best, never removed.

Le Vol. VI a détaillé comment Python résout obj.attr — d'abord le __dict__ de l'instance, puis celui de la classe, puis remontée du MRO (n°16), avec les descripteurs et property qui s'insèrent dans cette recherche (n°17), et __slots__ qui la modifie en remplaçant le dictionnaire par des emplacements fixes (n°18). Ce dernier numéro de la série pose la question restée en suspens depuis : tout cela a un coût, et ce coût n'est pas négligeable dans une boucle qui répète l'opération des millions de fois. Dans un langage à typage statique, obj.attr est résolu une fois, à la compilation, en un simple décalage mémoire. En Python, c'est en principe un appel de fonction — __getattribute__ — exécuté à chaque ligne, à chaque itération. Depuis Python 3.11, l'interpréteur spécialisant (PEP 659) raccourcit ce chemin quand il se répète à l'identique ; mais le raccourci doit être revérifié à chaque passage, et retombe sur la recherche complète dès que l'objet ou son type change de forme.Vol. VI detailed how Python resolves obj.attr — first the instance's __dict__, then the class's, then a walk up the MRO (issue №16), with descriptors and property inserting themselves into that search (issue №17), and __slots__ modifying it by replacing the dict with fixed slots (issue №18). This final issue in the series asks the question left hanging since then: all of this has a cost, and that cost isn't negligible in a loop that repeats the operation millions of times. In a statically typed language, obj.attr is resolved once, at compile time, into a simple memory offset. In Python, it's in principle a function call — __getattribute__ — executed on every line, every iteration. Since Python 3.11, the specializing interpreter (PEP 659) shortcuts that path when it repeats identically; but the shortcut must be rechecked on every pass, and falls back to the full search as soon as the object or its type changes shape.

Un décalage fixe ailleurs ; une recherche à chaque fois en PythonA fixed offset elsewhere; a search every time in Python
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(1, 2)
p.x   # dans un langage à typage statique : un décalage mémoire fixe,
       # calculé une fois à la compilation -- un accès quasi gratuit

       # en Python : obj.__getattribute__("x") -- une RECHERCHE, faite
       # à l'exécution -- p.__dict__, puis type(p), puis le MRO de
       # type(p), exactement le mécanisme du n°16. Depuis 3.11, CPython
       # mémorise le résultat à chaque site d'accès -- mais doit revérifier
       # ce raccourci à CHAQUE passage : un cache, jamais un décalage garanti
Le réflexe de tout le volumeThis whole volume's reflex

« Que coûte, au runtime, ce que le langage m'a laissé écrire gratuitement ? » — pour obj.attr, la réponse tient dans les trois chapitres qui suivent."What does this thing the language let me write for free actually cost at runtime?" — for obj.attr, the answer is in the next three chapters.

🔒

La suite est réservée The rest is members-only

Le premier numéro est libre. Débloque tout The Python Loop — tous les volumes, à vie — pour 5 €, paiement unique. The first issue is free. Unlock all of The Python Loop — every volume, forever — for €5, one-time.

Retour au kiosqueBack to newsstand