Suponho que você tenha uma CPU com 8 núcleos virtuais (provavelmente com quad-core com hyper-threading)? Isso significa que um thread / núcleo virtual da CPU totalmente carregado é igual a 12,5% da carga total.
O interpretador Python é um aplicativo que é executado apenas como um único processo por padrão e, portanto, não é capaz de tirar proveito de mais de um núcleo virtual. Mesmo que o código que você executa com ele use multithreading, ele ainda usará apenas um encadeamento da CPU / núcleo virtual, devido ao GIL (bloqueio global de intérpretes) .
Somente se o seu programa Python usar multiprocessamento , que de fato inicia várias instâncias do interpretador Python e permite que eles executem suas tarefas verdadeiramente paralelas, você pode tirar proveito de vários núcleos virtuais / threads de CPU. (Como o @SargeBorsch apontou em seu comentário, também existem algumas maneiras avançadas de conseguir isso sem multiprocessamento, mas isso normalmente não é algo que você escreve rapidamente.)