How CPython actually runs your code. Every article is written against a pinned interpreter tag and says outright which behaviour is a language guarantee and which is an implementation detail.
The order is computed from the prerequisites declared in the materials themselves, not assigned by an editor. It is not a required syllabus: every article stands on its own, but in this sequence there is less going back.
Topics are connected, and the connections here were not drawn by hand — they were counted: every article states what it builds on and what it sits next to, and the picture is assembled from those statements. A dashed circle is a topic the articles already call related but that has not been written yet.
The event loop: one thread, one queue, and six steps on repeat — connects to: From source to bytecode: the six steps Python takes before the first instruction, GIL: not “Python can't do threads,” but “a thread waits exactly as long as you asked”, Moving to async: the connection pool sets the ceiling, not the execution model
GIL: not “Python can't do threads,” but “a thread waits exactly as long as you asked” — connects to: Memory management in CPython: three numbers everyone repeats wrong, Moving to async: the connection pool sets the ceiling, not the execution model, The event loop: one thread, one queue, and six steps on repeat, The interpreter loop: where a frame lives and how control is dispatched
Python dictionaries from the inside: the CPython hash table — connects to: Lists from the inside: growth, shrinking, and the price of the front, Strings from the inside: three widths, four layout cases, interning, and the price of concatenation
Lists from the inside: growth, shrinking, and the price of the front — connects to: __slots__: what it changes in the object model and what it costs in bytes, Memory management in CPython: three numbers everyone repeats wrong, Python dictionaries from the inside: the CPython hash table, Strings from the inside: three widths, four layout cases, interning, and the price of concatenation
Memory management in CPython: three numbers everyone repeats wrong — connects to: __slots__: what it changes in the object model and what it costs in bytes, GIL: not “Python can't do threads,” but “a thread waits exactly as long as you asked”, Lists from the inside: growth, shrinking, and the price of the front, Strings from the inside: three widths, four layout cases, interning, and the price of concatenation
__slots__: what it changes in the object model and what it costs in bytes — connects to: Lists from the inside: growth, shrinking, and the price of the front, Memory management in CPython: three numbers everyone repeats wrong, The adaptive interpreter: how CPython rewrites itself as it goes, What happens on o.x: descriptors, the MRO and the type cache
The adaptive interpreter: how CPython rewrites itself as it goes — connects to: __slots__: what it changes in the object model and what it costs in bytes, Calling a function: what it costs, what does not happen, and where cells live, From source to bytecode: the six steps Python takes before the first instruction, The interpreter loop: where a frame lives and how control is dispatched, What happens on o.x: descriptors, the MRO and the type cache
What happens on o.x: descriptors, the MRO and the type cache — connects to: __slots__: what it changes in the object model and what it costs in bytes, Calling a function: what it costs, what does not happen, and where cells live, The adaptive interpreter: how CPython rewrites itself as it goes, The interpreter loop: where a frame lives and how control is dispatched
Calling a function: what it costs, what does not happen, and where cells live — connects to: The adaptive interpreter: how CPython rewrites itself as it goes, The interpreter loop: where a frame lives and how control is dispatched, Typing decorators: why the checker goes quiet, and what fixes it, What happens on o.x: descriptors, the MRO and the type cache
The interpreter loop: where a frame lives and how control is dispatched — connects to: Calling a function: what it costs, what does not happen, and where cells live, From source to bytecode: the six steps Python takes before the first instruction, GIL: not “Python can't do threads,” but “a thread waits exactly as long as you asked”, The adaptive interpreter: how CPython rewrites itself as it goes, What happens on o.x: descriptors, the MRO and the type cache
Typing decorators: why the checker goes quiet, and what fixes it — connects to: *args and **kwargs: two stars with different prices — and one of them makes unknown names acceptable, Calling a function: what it costs, what does not happen, and where cells live, Decorators: expressions top-down, application bottom-up