То, о чем вы спрашиваете, - это широкое поле «профилирования» вашего кода. Вам нужно посмотреть, что занимает больше всего времени (вероятно, «настенное» время), и глубже понять, что вызывает это. Некоторые вероятные варианты, но я просто предполагаю, что у меня нет вашего кода:
Ожидание на диске или в сети - обычное место, где ваш код может застрять. При профилировании вашего кода, посмотрите, читаете ли вы / пишете файлы или делаете сетевые вызовы, и если да, подумайте о написании вашего кода асинхронным или параллельным способом (например, используя asyncio или многопроцессорную обработку ) разрешить либо одному потоку Python одновременно работать с несколькими операциями ввода-вывода, либо параллельному блокированию нескольких процессов Python.
Вы уверены, что это 10% от 12 сердечники? Показания ЦП часто показывают процентное соотношение всех ядер, поэтому возможно, что то, что вы видите, составляет ~ 10% от всех ядер, что будет полным ядром. Это просто предложение перепроверить.
Для многих распространенных задач (нумерация c - это пример использования, с которым я особенно знаком), есть библиотеки Python которые реализуют общие операции в низкоуровневых библиотеках и предоставляют вам высокоуровневые инструменты, которые используют эти библиотеки (например, Numpy). Вот как большинство людей получают высокопроизводительный код в Python: используя код Python для создания сценариев и связывания операций, которые в основном реализуются в низкоуровневом коде различными библиотеками.
Но я уверен, что вам сообщат в комментариях и, возможно, даже пометят и закроют этот вопрос, вам нужно профилировать свой код и выяснить, куда идет время, а затем углубиться в это. Преждевременная оптимизация - это root всего зла .