# PyDepth > Python, its runtimes, frameworks, and the systems beneath them — read from source, measured, not assumed. - Language: en - Full text: https://pydepth.com/llms-full.txt - Feed: https://pydepth.com/rss.xml ## Categories Four pillars. Every entry answers the question of exactly one of them. - [Runtime](https://pydepth.com/category/runtime/) — What CPython does with the objects, modules and frames you hand it — object layout, the import system, the eval loop, memory behaviour. (6) - [Concurrency](https://pydepth.com/category/concurrency/) — What is actually parallel, and what the scheduling costs. Threads, the GIL, free threading, asyncio, subinterpreters and processes. (2) - [Tooling](https://pydepth.com/category/tooling/) — What the toolchain does at build, import or check time — import graphs, annotation resolution, profilers, benchmark harnesses, packaging. (2) - [Frameworks](https://pydepth.com/category/frameworks/) — Django, FastAPI and SQLAlchemy measured inside a real request rather than in the quickstart, counted in queries and milliseconds. (1) ## Series Entries written to be read in order, listed in that order. - [Inside the interpreter](https://pydepth.com/series/inside-the-interpreter/) — What CPython actually does with the objects, modules and threads you hand it — measured on a real interpreter rather than argued from the docs. 1. [The Shape of a Python Object](https://pydepth.com/blog/the-shape-of-a-python-object/) 2. [What import Actually Does](https://pydepth.com/blog/what-import-actually-does/) 3. [The GIL Is Not a Lock on Your CPU](https://pydepth.com/blog/the-gil-is-not-a-lock-on-your-cpu/) 4. [Slots Did Not Get Slower, One Build Did](https://pydepth.com/blog/slots-did-not-get-slower/) - [The import graph](https://pydepth.com/series/the-import-graph/) — What an import costs, who gets charged for it, and what deferring it actually moves — measured on the interpreter that shipped the feature. 1. [lazy import Moved 26.8 ms and Removed None of It](https://pydepth.com/blog/what-lazy-import-defers/) 2. [Swapping Two Imports Moved 5.5 ms to a Different Module](https://pydepth.com/blog/import-time-is-not-import-cost/) ## Posts - [Swapping Two Imports Moved 5.5 ms to a Different Module](https://pydepth.com/blog/import-time-is-not-import-cost/) — 2026-09-27 — Importing logging before asyncio moves 5.5 ms from asyncio's line to logging's. The program does the same work. The cumulative column charges whoever got there first. (Markdown: https://pydepth.com/blog/import-time-is-not-import-cost.md) - [lazy import Moved 26.8 ms and Removed None of It](https://pydepth.com/blog/what-lazy-import-defers/) — 2026-09-20 — A lazy import of asyncio costs no measurable time and no modules at startup. Read the name once and 26.4 of the 26.8 ms come back. Deferral is not removal. (Markdown: https://pydepth.com/blog/what-lazy-import-defers.md) - [A NamedTuple Read Cost 0.81x a Plain One, Then 1.9x](https://pydepth.com/blog/the-cost-of-a-field/) — 2026-09-13 — On CPython 3.10 a NamedTuple attribute read cost 0.81x a read through an instance dictionary. On 3.11 it costs 1.90x. Nothing about NamedTuple changed. (Markdown: https://pydepth.com/blog/the-cost-of-a-field.md) - [getsizeof Reports 296 Bytes, Then 96, for the Same Class](https://pydepth.com/blog/what-getsizeof-does-not-count/) — 2026-09-06 — sys.getsizeof reports 296 bytes for a class's first instance dict and 96 once twenty-six exist. The instance itself costs 96 bytes and getsizeof says 48. (Markdown: https://pydepth.com/blog/what-getsizeof-does-not-count.md) - [Slots Did Not Get Slower, One Build Did](https://pydepth.com/blog/slots-did-not-get-slower/) — 2026-08-30 — A read through __slots__ costs 24% more than one through an instance dictionary on CPython 3.13.2. Rebuild the same version and the gap goes away. (Markdown: https://pydepth.com/blog/slots-did-not-get-slower.md) - [Type Hints at Run Time](https://pydepth.com/blog/type-hints-at-runtime/) — 2026-08-25 — Annotations cost nothing per call and everything at import. Reading __annotations__ takes 24 ns; resolving the same class with get_type_hints takes 3.4 µs, 140x more. (Markdown: https://pydepth.com/blog/type-hints-at-runtime.md) - [Where Your Django Request Time Actually Goes](https://pydepth.com/blog/where-django-request-time-goes/) — 2026-08-19 — Removing Django's entire default middleware chain saved 0.02 ms per request. Fixing one N+1 query on a fifty-row list view saved 3.30 ms. (Markdown: https://pydepth.com/blog/where-django-request-time-goes.md) - [The Real Cost of an async Call](https://pydepth.com/blog/the-real-cost-of-an-async-call/) — 2026-08-12 — Awaiting a coroutine that never suspends costs 53 ns against 24 ns for a plain call. Wrapping the same coroutine in a Task and awaiting it costs 28,958 ns. (Markdown: https://pydepth.com/blog/the-real-cost-of-an-async-call.md) - [The GIL Is Not a Lock on Your CPU](https://pydepth.com/blog/the-gil-is-not-a-lock-on-your-cpu/) — 2026-08-04 — Eight threads of pure-Python arithmetic run at 0.98x the speed of one. The same eight threads doing IO run at 7.90x. The GIL is a scheduler, and it has a dial. (Markdown: https://pydepth.com/blog/the-gil-is-not-a-lock-on-your-cpu.md) - [What import Actually Does](https://pydepth.com/blog/what-import-actually-does/) — 2026-07-23 — Importing asyncio costs 21.9 ms and pulls in 100 modules. Importing email costs 0.1 ms and pulls in one. Granularity predicts import cost; size does not. (Markdown: https://pydepth.com/blog/what-import-actually-does.md) - [The Shape of a Python Object](https://pydepth.com/blog/the-shape-of-a-python-object/) — 2026-07-14 — An instance with three attributes costs 96 bytes, not the 344 sys.getsizeof reports, and __slots__ read 12% slower on the CPython 3.13.2 build measured here. (Markdown: https://pydepth.com/blog/the-shape-of-a-python-object.md) ## Pages - [About](https://pydepth.com/about/) — Python folklore outlives the interpreter it was measured on. What PyDepth publishes, who writes it, what a figure has to clear, and how an entry is made. - [Contact](https://pydepth.com/contact/) — One address for corrections, topic requests, syndication and data protection requests concerning pydepth.com. - [Privacy Policy](https://pydepth.com/privacy/) — What pydepth.com processes, on what legal basis under the GDPR, for how long, and how to exercise your rights. No analytics, no cookies. - [Cookie Policy](https://pydepth.com/cookies/) — This site sets no cookies. One local storage key remembers your theme, which is why there is no consent banner. - [Terms of Use](https://pydepth.com/terms/) — The terms on which pydepth.com is published — what you may reuse, what is not warranted, and the law that governs it. ## Data - Experiments repository: https://github.com/CognatePress/erperiments.pydepth.com Every figure on this site was produced by a script in that repository, run on the interpreter and machine named beside it in the entry. Each entry names the script it ran by path. Reproducing a figure is a clone and one command.