19

Я использую Python для выполнения некоторых алгоритмов, и независимо от того, какой Python я использую, и я перепробовал много версий, загрузка ЦП достигает 25%. Почему Python не использует все остальные ресурсы моего процессора? Я изменил приоритет службы с обычного на высокий, а затем на реальное время с перезапусками между ними, но ничего не изменилось.

Есть ли способ заставить Python использовать 50% или даже больше моего процессора?

2 ответа2

19

Проще говоря, вы запускаете однопоточное приложение в системе с 4 логическими ядрами - поэтому у вас есть один процесс, использующий все ядро.

Вам нужно (и это не тривиально) переписать алгоритм так, чтобы он был многопоточным, или посмотреть, сможете ли вы просто запустить 2 или более экземпляра на конкретных ядрах, чтобы использовать больше вашего процессора. Другого пути нет.

13

Язык Python предшествует многоядерным процессорам, поэтому не удивительно, что он не использует их изначально.

Кроме того, не все программы могут получить прибыль от нескольких ядер. Вычисление, выполненное поэтапно, где следующий шаг зависит от результатов предыдущего шага, не будет быстрее с использованием большего количества ядер. Проблемы, которые можно векторизовать (применяя одни и те же вычисления к большим массивам данных), можно относительно легко использовать с использованием нескольких ядер, поскольку отдельные вычисления независимы.

Когда вы делаете много расчетов, я предполагаю, что вы используете NumPy? Если нет, проверьте это. Это расширение, написанное на C, которое может использовать оптимизированные библиотеки линейной алгебры, такие как ATLAS. Это может значительно ускорить численные расчеты по сравнению со стандартным питоном.

Сказав это, есть несколько способов использовать несколько ядер с Python.

  • Встроенным является multiprocessing модуль. multiprocessing.Pool обеспечивает векторизацию для нескольких процессоров с помощью map() и связанных методов. Здесь есть компромисс здесь. Если вам приходится передавать большие объемы данных между процессами, эти издержки могут свести на нет преимущество нескольких ядер.
  • Используйте подходящую сборку NumPy. Если numpy построен с использованием многопоточной библиотеки ATLAS, это будет быстрее при больших проблемах.
  • Используйте модули расширения, такие как NumberxPr, параллельный Python, CorePy или Copenhagen Vector Byte Code.

Обратите внимание, что модуль threading не так уж полезен в этом отношении. Для простоты управления памятью глобальная блокировка интерпретатора ("GIL") обеспечивает выполнение только одного потока за раз байт-кодом python. Внешние модули, такие как numpy, могут использовать несколько потоков внутри.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .