2016-02-05 2 views
0

У меня есть два аналогичных кусок кода, скорость очень разные:многопроцессорная вопрос скорости карты питона со списком

Код 1: Исполнение в 16seconds

def mc05(): 
    num_procs = 4 
    iters = 1000000000 
    its = iters/num_procs 
    pool = mp.Pool(processes=num_procs) 

    result = pool.map(mpf.integrate3, [its] * num_procs)  

    print(sum(result)/float(num_procs)) 
    pool.terminate(); pool.join(); 

Кодекса2: Время выполнения: 32seconds (= 1 процесс)

def mc05(): 
    num_procs = 4 
    iters = 1000000000 
    its = iters/num_procs 
    pool = mp.Pool(processes=num_procs) 

    result = pool.map(mpf.integrate3, [iters])  

    print(sum(result)/float(num_procs)) 
    pool.terminate(); pool.join(); 

Единственное отличие происходит от списка, где в коде 2 оно упрощено ... Почему это другое?

ответ

0

Code1

... [its] * num_procs == [its, its, its, its] 

Кодекса2

... [iters] == [1000000000] 

Карта, функция перебирает список. В Code2 это только итерация через одно значение. Код1 выполняет итерацию через список размером 4, вызывающий эту функцию для каждого элемента в списке. Вы должны проверить, получаете ли вы одинаковые результаты для обеих частей кода. Я не слишком хорошо знаком с mpf.integrate3, но код1 будет медленнее, поскольку функция карты выполняется через список размером 4). Либо это, либо Code2 работает медленнее, потому что в списке работает только один процесс [1000000000]. Я не совсем уверен, как все работает, потому что я не знаком с многопроцессорным пулом.

+0

Спасибо, извините, я неправильно интерпретирую смысл [его] * num_procs: он создает вектор размера 4. –

1
pool = mp.Pool(processes=num_procs) 

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

Теперь, когда вы

pool.map(mpf.integrate3, [iters]) 

ваш [iters] список имеет только одно значение то есть [1000000000] так будет запущен только один процесс.

Когда вы

result = pool.map(mpf.integrate3, [its] * num_procs) 

ваш список [its] * num_procs имеет 4 значения, т.е. [250000000, 250000000, 250000000, 250000000], так 4 процессы будут запущены в бассейне.

Смежные вопросы