Многопроцессорная обработка Python кажется медленнее, чем обычное - PullRequest
0 голосов
/ 30 ноября 2018

В приведенном ниже коде я генерирую куб с номером 9999 и вызываю его через пул потоков и обычный метод.

Я синхронизирую разницу между ними.Похоже, что нормальный метод намного быстрее.Я запускаю его на процессоре Intel i7 8-го поколения с 16-гигабайтным ОЗУ внутри терминала Python 2.7.

Я озадачен этим.Может быть, я что-то упустил.Я надеюсь, что этот вопрос будет полезным для людей в будущем.

import time
from multiprocessing.pool import ThreadPool

def cube():
    return 9999*9999*9999

print "Start Execution Threading: "
x = int(round(time.time() * 1000))
pool = ThreadPool()

for i in range(0,100):
  result = pool.apply_async(cube, ())
  result = pool.apply_async(cube, ())
  result = pool.apply_async(cube, ())
  # print result.get()

pool.close()
pool.join()

print "Stop Execution Threading: "
y = int(round(time.time() * 1000))

print y-x

print "Start Execution Main: "
x = int(round(time.time() * 1000))

for i in range(0,100):
  cube()
  cube()
  cube()

print "Stop Execution Main: "
y = int(round(time.time() * 1000))
print y-x

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Из-за from multiprocessing.pool import ThreadPool вы используете многопоточность, а не многопроцессорность.CPython использует глобальную блокировку интерпретатора, чтобы предотвратить одновременное выполнение кода Python более чем одним потоком.

Таким образом, поскольку ваша программа ограничена ЦП, вы добавляете издержки потоков без каких-либо преимуществ из-за GIL.Многопоточность имеет смысл в Python для проблемы, связанной с вводом-выводом, потому что поток может работать, пока другие ожидают завершения ввода-вывода.

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

0 голосов
/ 30 ноября 2018

Многопроцессорность означает, что вы начнете новый поток.Это идет с большими накладными расходами в том, что это должно быть инициализировано.Таким образом, многопоточность окупается, особенно в python, когда вы распараллеливаете задачи, выполнение которых само по себе занимает значительное время (по сравнению со временем запуска python) и которым можно разрешить асинхронную работу.

В вашем случае простое умножение выполняется так быстро, что не окупится.

...