Как увеличить использование процессора Python

21

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

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

Христос К.
источник
ваш процессор многоядерный процессор?
Подмастерье Компьютерщик
да, это i5-480M и в панели управления> параметры питания> процессор мин / макс на 100%
Christos K.

Ответы:

20

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

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

Подмастерье Компьютерщик
источник
Я боялся, что это будет иметь место, но на диаграммах использования процессора в диспетчере задач Windows я не вижу, чтобы 1 диаграмма была на пике во время выполнения алгоритма, напротив, я вижу их все со значительным увеличением.
Христос К.
1
Ваша система балансирует нагрузку между ядрами. Тем не менее, два ядра не используются одновременно.
Гроностай
ребята, вы подтвердили мои опасения, кажется, пришло время начать читать о потоках
Кристос К.
@ fractal_7: многопоточность может не принести ожидаемых результатов. Смотрите мой ответ ниже.
Роланд Смит
15

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

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

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

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

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

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

Роланд Смит
источник
До сих пор я использовал Python 2.7 Ironpython и попробовал Pypy. Я дам шанс NumPy. но все же мне придется прочитать, прежде чем я смогу использовать любой многопроцессорный модуль.
Христос К.