Почему моя программа Python усредняет только 33% CPU на процесс? Как я могу заставить Python использовать весь доступный процессор?

Я использую Python 2.5.4. Мой компьютер: процессор AMD Phenom X3 720BE, Mainboard 780G, 4GB RAM, Windows 7 32 бит.

Я использую Python threading, но не могу сделать каждый python.exe процесс потребляет 100% процессора. Почему они используют только около 33-34% в среднем?.

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

изменить: Благодарить всех. Теперь я использую параллельный Python и все работает хорошо. Мой процессор теперь всегда на 100%. Спасибо всем!

7 ответов


похоже, что у вас есть 3-ядерный процессор. Если вы хотите использовать более одного ядра процессора в собственном коде Python, вам нужно создать несколько процессов. (Два или более потоков Python не могут работать одновременно на разных процессорах)

As Р. Паштет сказал, в Python multiprocessing модуль-это один из способов. Тем не менее, я бы предложил посмотреть на Параллельный Python вместо. Он занимается распределением задач и передачей сообщений. Вы даже можете запускать задачи на множество отдельных компьютеров С небольшим изменением кода.

использовать его довольно просто:

import pp

def parallel_function(arg):
    return arg

job_server = pp.Server() 

# Define your jobs
job1 = job_server.submit(parallel_function, ("foo",))
job2 = job_server.submit(parallel_function, ("bar",))

# Compute and retrieve answers for the jobs.
print job1()
print job2()

попробовать многопроцессорность модуль, как Python, в то время как он имеет реальные собственные потоки, ограничит их одновременное использование, пока Gil удерживается. Еще одна альтернатива, и что-то вы должны посмотреть, если вам нужно реальные speed, пишет модуль расширения C и вызывает в нем функции из Python. Вы можете освободить GIL в этих функциях C.

см. Также Дэвид Бизли ' s умопомрачительный Гил.


Глобальная Блокировка Интерпретатора

причины использования такой блокировки включают:

* increased speed of single-threaded programs (no necessity to acquire or release locks
  on all data structures separately)
* easy integration of C libraries that usually are not thread-safe.

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


от использования процессора похоже, что вы все еще работаете на одном ядре. Попробуйте выполнить тривиальное вычисление с 3 или более потоками с тем же потоковым кодом и посмотрите, использует ли он все ядра. Если это не так, то может быть не так с вашим кодом потоков.


насчет Stackless Python?


вы узкое место, вероятно, где-то еще, например, жесткий диск (подкачка) или доступ к памяти.


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

вот некоторая информация для windows 7:

Монитор Производительности: Вы можете использовать Windows Performance Monitor для изучения того, как запущенные программы влияют на производительность вашего компьютера, Как в режиме реального времени, так и путем сбора данных журнала для последующего анализа. ( Панель управления - > все элементы панели управления - >информация о производительности и Инструменты - > Расширенные Инструменты - > Просмотр Монитора Производительности)

Монитор Ресурсов: Монитор ресурсов Windows-это системный инструмент, который позволяет просматривать информацию об использовании аппаратных (CPU, память, диск и сеть) и программных (дескрипторы файлов и модули) ресурсов в режиме реального времени. Монитор ресурсов можно использовать для запуска, остановки, приостановки и возобновления процессов и служб. ( Панель управления - > все элементы панели управления - >информация о производительности и Инструменты - > Расширенные Инструменты - > Просмотр Монитора Ресурсов)