У меня есть быстрый вопрос относительно многопроцессорности в python.
Я провожу поиск в довольно большой сетке по трем параметрам, и вычисления занимают около 14 часов. Я хотел бы сократить это время выполнения, используя многопроцессорность.
Очень упрощенный пример моего кода здесь:
import numpy as np
import pickle
import time
a_range = np.arange(14, 18, 0.2)
b_range = np.arange(1000, 5000, 200)
c_range = np.arange(12, 21, .5)
a_position = range(len(a_range))
b_position = range(len(b_range))
c_position = range(len(c_range))
data_grid = np.zeros([len(a_range), len(b_range), len(c_range)])
record_data = []
start_time = time.time()
for (a,apos) in zip(a_range, a_position):
for (b, bpos) in zip(b_range, b_position):
for (c, cpos) in zip(c_range, c_position):
example = a+b+c #The math in my model is much more complex and takes
#about 7-8 seconds to process
data_grid[apos, bpos, cpos] = example
record_data.append([a, b, c, example])
with open('Test_File', 'wb') as f:
pickle.dump(record_data, f)
np.save('example_values', data_grid)
print 'Code ran for ', round(time.time()-start_time,2), ' seconds'
Теперь у меня абсолютно нулевой опыт многопроцессорной обработки, поэтому моей первой попыткой было преобразовать циклы for в функцию, а затем вызвать многопроцессорную функцию следующим образом:
def run_model(a, b, c, apos, bpos, cpos):
example=a+b+c
data_grid[apos, bpos, cpos]=example
record_data.append([a, b, c, example])
from multiprocessing import Pool
if __name__=='__main__':
pool=Pool(processes=4)
pool.map(run_model, [a_range, b_range, c_range, a_position, b_positon, c_positon])
pool.close()
pool.join()
Однако это не удалось при вызове pool.map. Я понимаю, что эта функция принимает только один повторяемый аргумент, но я не знаю, как решить проблему. Я также сомневаюсь, что переменная data_grid будет заполнена правильно. Результатом, который я хочу получить от этой функции, являются два сохраненных файла: один как массив значений, индексы которых соответствуют значениям a, b и c, а последний представляет собой список списков, содержащих значения a, b, c и результирующее значение (пример в коде выше)
Спасибо за любую помощь!
-Буду
numpy.meshgrid
поможет, но я не могу попробуйте прямо сейчас. Посмотри на это. - person wwii   schedule 30.06.2016record_data
) из вашей функцииrun_model
и получить результат в переменной, такой какres = p.map(f, [1, 2, 3])
. Кроме того, методmap
принимает (по крайней мере, в Python 3) аргумент chunksize для разделения вашего iterable. - person mgc   schedule 30.06.2016