Python Interpreter использует только 12% мощности процессора
26
Я использую Python на Ubuntu для анализа текста. Несмотря на значительный объем работы, программа выполняет загрузку ЦП, как показано на системном мониторе, постоянно на уровне 12%.
Я изменил приоритет программы с Normalна, Very Highно это не имело никакого эффекта.
Что ограничивает объем использования процессора, который может получить моя программа на Python, и как я могу это изменить, чтобы программа могла использовать больше ресурсов процессора?
Я предполагаю, что у вас есть процессор с 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
Другая возможность, менее вероятная в этом случае, заключается в том, что программа привязана к диску, то есть она медленно читает и пишет на / с диска, а процессор ожидает диск.
Jython
илиIronPython
, которые не имеют GIL.Другая возможность, менее вероятная в этом случае, заключается в том, что программа привязана к диску, то есть она медленно читает и пишет на / с диска, а процессор ожидает диск.
источник
iotop
следить за программами, привязанными к iowait