Как распараллелить этот кусок кода?

Я просматривал в течение некоторого времени, но не мог найти никакого конструктивного ответа, который я мог бы понять.

Как я должен паралеллизировать следующий код:

import random
import math
import numpy as np
import sys
import multiprocessing

boot = 20#number of iterations to be performed
def myscript(iteration_number):  
    #stuff that the code actually does


def main(unused_command_line_args):
    for i in xrange(boot):
        myscript(i)
    return 0

if __name__ == '__main__':
    sys.exit(main(sys.argv))

или где я могу прочитать об этом? Я не совсем уверен, как его искать.

1 ответ

Решение

Существует довольно естественный переход от цикла for к параллельному для серии смущающих параллельных заданий.

>>> import multiprocess as mp
>>> # build a target function
>>> def doit(x):
...   return x**2 - 1
... 
>>> x = range(10)
>>> # the for loop
>>> y = []   
>>> for i in x:
...   y.append(doit(i))
... 
>>> y
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]

Так как же обратиться к этой функции параллельно?

>>> # convert the for loop to a map (still serial)
>>> y = map(doit, x)
>>> y
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]
>>> 
>>> # build a worker pool for parallel tasks
>>> p = mp.Pool()
>>> # do blocking parallel
>>> y = p.map(doit, x)
>>> y
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]
>>> 
>>> # use an iterator (non-blocking)
>>> y = p.imap(doit, x)
>>> y            
<multiprocess.pool.IMapIterator object at 0x10358d150>
>>> print list(y)
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]
>>> # do asynchronous parallel
>>> y = p.map_async(doit, x)
>>> y
<multiprocess.pool.MapResult object at 0x10358d1d0>
>>> print y.get()
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]
>>>
>>> # or if you like for loops, there's always this…
>>> y = p.imap_unordered(doit, x)
>>> z = []
>>> for i in iter(y):
...   z.append(i)
... 
>>> z
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]

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

Обратите внимание, что я использовал multiprocess (вилка) вместо multiprocessing... но чисто потому, что multiprocess лучше при работе с интерактивно определенными функциями. В противном случае приведенный выше код одинаков для multiprocessing,

Другие вопросы по тегам