2017-02-08 2 views
3

У меня есть следующий код, который я хочу ускорить (используя многопроцессорность).Многопроцессорный цикл в Python

def main(arg1): 
    data=[] 
    #Calculate new argument arg2 
    for i in range(n): 
     data.append(function(z,i,arg2)) 

Где z в 2D-массиве. Моя идея состояла в том, чтобы сделать это следующим образом, но я не уверен, что это ускорит процесс.

from multiprocessing import Pool 
import itertools 

def function_star(a_b_c): 
    return function(*a_b_c) 

def main(arg1): 
    #Calculate new argument arg2 
    pool=Pool() 
    i=range(n) 
    out=pool.map(function_star, i, itertools.repeat(z),itertools.repeat(arg2)) 
    pool.close() 

if __name__=="__main__": 
    main(arg1) 

Действительно ли это самый эффективный способ ускорить процесс?

ответ

1

Если интерпретировать ваш блок кода правильно, вы хотите иметь function под названием с всегда же z и arg1 но с i быть диапазон (я немного не уверен, потому что вставленный код не будет работать, так как map только принимает один итерацию и вы даете 3)

Если это так, то partial решает проблему:

from multiprocessing import Pool 
from functools import partial 

def function(i, z, arg2): 
    print(z, i, arg2) 

def main(arg1): 
    #Calculate new argument arg2 
    pool=Pool() 
    i=range(n) 

    out=pool.map(partial(function, z=5, arg2=3), i) 
    pool.close() 

if __name__=="__main__": 
    main(arg1) 

к сведению, что вам нужно изменить порядок аргументов в функции так, что изменение 0 Параметрнаходится в первом положении.

Если вам нужна скорость, вы должны добавить третий аргумент в map с помощью chunksize. Это приводит к тому, что процесс запрашивает пакет chunksize из основного процесса, поэтому у вас меньше сообщений между основным процессом и дочерними процессами.