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


26

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

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

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

Ответы:


73

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

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

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


Это на самом деле имеет большой смысл. Да, у меня есть четырехъядерный процессор с 4 ядрами (8 виртуальных ядер). Тай
Матиас Херрманн

9
@MatthiasHerrmann Вы могли бы рассмотреть системный монитор, чтобы показать вам, на сколько процентов работает каждый процессор. Таким образом, вы могли видеть только 1 из 8 процессоров на 100%. Вот одна тема в AU на эту тему: «Гаджеты» Windows эквивалентны (для использования wifi и cpu)?
WinEunuuchs2Unix

7
Неверно, можно просто использовать все ядра из одного процесса Python. Нужно просто вызвать код C и выпустить GIL. И многие существующие библиотеки делают именно это (например, numpy).
Сардж Борщ

2
Или используйте Jythonили IronPython, которые не имеют GIL.
Стоп Harm Моника

19

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


5
попробуйте iotopследить за программами, привязанными к iowait
кошка

1
Или сам код является синхронным и блокирующим.
Зиднар

Это была моя ошибка, спасибо
Fipsi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.