Я использую Python для выполнения некоторых алгоритмов, и независимо от того, какой Python я использую, и я перепробовал много версий, загрузка ЦП достигает 25%. Почему Python не использует все остальные ресурсы моего процессора? Я изменил приоритет службы с обычного на высокий, а затем на реальное время с перезапусками между ними, но ничего не изменилось.
Есть ли способ заставить Python использовать 50% или даже больше моего процессора?
Ответы:
Проще говоря, вы запускаете однопоточное приложение в системе с 4 логическими ядрами - поэтому у вас есть один процесс, использующий все ядро.
Вам нужно (и это не тривиально) переписать алгоритм, чтобы он был многопоточным, или посмотреть, сможете ли вы просто запустить 2 или более экземпляра на конкретных ядрах, чтобы использовать больше вашего процессора. Другого пути нет.
источник
Язык Python предшествует многоядерным процессорам, поэтому не странно, что он не использует их изначально.
Кроме того, не все программы могут получать прибыль от нескольких ядер. Вычисление, выполненное поэтапно, где следующий шаг зависит от результатов предыдущего шага, не будет быстрее при использовании большего количества ядер. Проблемы, которые можно векторизовать (применяя одни и те же вычисления к большим массивам данных), можно относительно легко использовать с использованием нескольких ядер, поскольку отдельные вычисления независимы.
Когда вы делаете много расчетов, я предполагаю, что вы используете NumPy ? Если нет, проверьте это. Это расширение, написанное на C, которое может использовать оптимизированные библиотеки линейной алгебры, такие как ATLAS. Это может значительно ускорить численные расчеты по сравнению со стандартным Python.
Сказав это, есть несколько способов использовать несколько ядер с Python.
multiprocessing
модуль.multiprocessing.Pool
Класс предоставляет векторизации по нескольким процессорам сmap()
и связанными с ними методами. Здесь есть компромисс здесь. Если вам приходится передавать большие объемы данных между процессами, то эти издержки могут свести на нет преимущество нескольких ядер.Обратите внимание, что
threading
модуль не так уж полезен в этом отношении. Для простоты управления памятью глобальная блокировка интерпретатора («GIL») обеспечивает выполнение только одного потока за раз байт-кодом Python. Внешние модули, такие как numpy, могут использовать несколько потоков внутри.источник