Действительно короткая версия состоит в том, что в настоящее время python управляет памятью с помощью подсчета ссылок + схема сборщика меток и циклов развертки, оптимизированная для задержки (вместо пропускной способности).
Это нормально, когда существует только один мутирующий поток, но в многопоточной системе вам нужно синхронизировать все время, когда вы изменяете refcounts, иначе у вас могут быть значения "падение через трещины" и синхронизация примитивы довольно дороги на современном оборудовании.
Если бы refcounts не менялись так часто, это не было бы проблемой, но почти каждая операция, которую вы делаете в cpython, может привести к тому, что refcount где-то изменится, поэтому возможны варианты GIL, делая refcounts с некоторым видом синхронизации (и буквально тратят почти все свое время на синхронизацию) или отказываются от системы пересчета для какого-то реального сборщика мусора.