Python Interpreter использует только 12% мощности процессора

26

Я использую Python на Ubuntu для анализа текста. Несмотря на значительный объем работы, программа выполняет загрузку ЦП, как показано на системном мониторе, постоянно на уровне 12%.

Я изменил приоритет программы с Normalна, Very Highно это не имело никакого эффекта.

Что ограничивает объем использования процессора, который может получить моя программа на Python, и как я могу это изменить, чтобы программа могла использовать больше ресурсов процессора?

Матиас Херрманн
источник

Ответы:

73

Я предполагаю, что у вас есть процессор с 8 виртуальными ядрами (возможно, четырехъядерный с гиперпоточностью)? Это означает, что один полностью загруженный поток ЦП / виртуальное ядро ​​равен 12,5% общей нагрузки.

Интерпретатор Python - это приложение, которое по умолчанию выполняется только как один процесс и поэтому не может использовать более одного виртуального ядра. Даже если код, который вы запускаете, использует многопоточность, он все равно будет использовать только один поток ЦП / виртуальное ядро ​​из-за GIL (глобальной блокировки интерпретатора) .

Только если ваша программа на Python использует многопроцессорную обработку , которая фактически запускает несколько экземпляров интерпретатора Python и позволяет им выполнять ваши задачи действительно параллельно, вы можете использовать преимущества нескольких виртуальных ядер / потоков ЦП. (Как отметил @SargeBorsch в своем комментарии, есть также несколько продвинутых способов добиться этого без многопроцессорной обработки, но обычно это не то, что вы сами быстро пишете.)

Byte Commander
источник
Это на самом деле имеет большой смысл. Да, у меня есть четырехъядерный процессор с 4 ядрами (8 виртуальных ядер). Тай
Матиас Херрманн
9
@MatthiasHerrmann Вы могли бы рассмотреть системный монитор, чтобы показать вам, на сколько процентов работает каждый процессор. Таким образом, вы могли видеть только 1 из 8 процессоров на 100%. Вот одна тема в AU на эту тему: «Гаджеты» Windows эквивалентны (для использования wifi и cpu)?
WinEunuuchs2Unix
7
Неверно, можно просто использовать все ядра из одного процесса Python. Нужно просто вызвать код C и выпустить GIL. И многие существующие библиотеки делают именно это (например, numpy).
Сардж Борщ
2
Или используйте Jythonили IronPython, которые не имеют GIL.
Стоп Harm Моника
19

Другая возможность, менее вероятная в этом случае, заключается в том, что программа привязана к диску, то есть она медленно читает и пишет на / с диска, а процессор ожидает диск.

jmmcd
источник
5
попробуйте iotopследить за программами, привязанными к iowait
кошка
1
Или сам код является синхронным и блокирующим.
Зиднар
Это была моя ошибка, спасибо
Fipsi