1

У меня есть генетический алгоритм, который я бы хотел ускорить. Я думаю, что самый простой способ добиться этого - модулем многопроцессорности pythons. После запуска cProfile на моей GA, я узнал, что большая часть вычислительного времени имеет место в функции оценки.Parallelize for loop in python

def evaluation(): 
    scores = [] 
    for chromosome in population: 
     scores.append(costly_function(chromosome)) 

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

Я использую Python 2.7

+0

Использование 'multiprocessing.Pool.map'. Результаты будут упорядочены так же, как и в вашем опубликованном коде. –

ответ

2

Используйте бассейн (я показываю как и карту IMAP из-за некоторые результаты на Google говорят, карта не может быть хорошо для заказа, хотя я до сих пор видеть доказательство):

from multiprocessing import Pool 
def evaluation(population): 
    return list(Pool(processes=nprocs).imap(costly_function,population)) 

или (что я использую):

return Pool(processes=nprocs).map(costly_function,population) 

Определить nprocs числу параллельных процесса вы хотите.

От: https://docs.python.org/dev/library/multiprocessing.html#multiprocessing.pool.Pool

+0

Я не думаю, что так будут оцениваться в том же порядке, что и в случае, если программа будет выполняться последовательно – MMF

+0

Я предлагаю вам попробовать, а не гадать, это будет (если вы не верите в использование короткого списка во-первых). Примечание. Я отредактировал синтаксическую ошибку. – kabanus

+0

Я подтвердил, что 'Pool.map' хранит первоначальный заказ. Я создал функцию, которая принимает индекс, спит случайное количество времени и возвращает индекс. Независимо от количества процессов или chunkksize 'Pool.map' поддерживает порядок более сотен элементов. Это имеет смысл, потому что 'Pool.map' моделируется после встроенной функции' map() '. –

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

  • Нет связанных вопросов^_^