2015-04-22 4 views
0

Этот вопрос, следующий за этим [1]. У меня большой 3D-массив, и я должен сделать некоторые тяжелые вычисления на нем. Я хотел бы разделить кусочек моего массива на 4 части и выполнить вычисления для каждой части с каждым 4 ядрами моего компьютера ... И сделайте это для каждого фрагмента моего 3D-массива ... что является лучшим способом для сделай это?Многопроцессорные вычисления для одного массива

import numpy 

size = 8. 
Y=(arange(2000)) 
X=(arange(2000)) 
(xx,yy)=meshgrid(X,Y) 

array=zeros((Y.shape[0],X.shape[0],size)) 

array[:,:,0] = 0 
array[:,:,1] = X+Y 
array[:,:,2] = X*cos(X)+Y*sin(Y) 
array[:,:,3] = X**3+sin(X)+X**2+Y**2+sin(Y) 

ответ

1

Вы можете использовать Pool из multiprocessing модуля:

from multiprocessing import Pool 

def f(num): 
    return num * 2 # replace with heavy computation 

lst = [1,2,3,4,5,6,7,8,9,10,11] 
p = Pool(4) 
print p.map(f, lst) 

Он будет работать одинаково хорошо с 3-мерной Numpy массива:

from multiprocessing import Pool 
import numpy 

def f(num): 
    return num * 2 # replace with heavy computation 

arr = numpy.array(
    [numpy.array([ 
    numpy.array([1,2,3]), 
    numpy.array([4,5,6]), 
    numpy.array([7,8,9])]), 
    numpy.array([ 
    numpy.array([1,2,3]), 
    numpy.array([4,5,6]), 
    numpy.array([7,8,9])])]) 
p = Pool(4) 
print p.map(f, arr) 
+0

Спасибо за вашу помощь, но когда я вычислил время с многопроцессорным и без него ... я нахожу, что без многопроцессорного i m быстрее: s – user3601754

+0

@ user3601754 Насколько дорогим является каждый вызов 'f'? Если 'f' не занимает много времени для запуска, то« многопроцессорство »не поможет, потому что накладные расходы на передачу содержимого массива между процессами будут больше, чем преимущество запуска 4 экземпляров' f 'одновременно. – dano

1

В качестве альтернативы многопроцессорной, вы может использовать модуль concurrent.futures:

import concurrent.futures 

def f(num): 
    return num * 2 
arr = […] 

with concurrent.futures.ProcessPoolExecutor() as exc: 
    print(list(exc.map(f, arr))) 
+0

Спасибо за помощь! Я пытаюсь это сделать, но когда я печатаю, я получаю «<карта объектного генератора в 0x7f0ef49496e0>», и я не нахожу, как читать мои результаты: s – user3601754

+0

См. Документ для генераторов python: https://wiki.python.org/moin/Generators , Вы можете перебирать результаты 'exc.map()' с помощью цикла for – Arthur

+0

. Самый простой способ сделать «сделать что-то на каждом элементе этого массива, сделать это параллельно». Стоит отметить, что [ProcessPoolExecutor() будет по умолчанию использовать количество процессоров в машине] (https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor) – haschdl

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