Parallel.For в Python - PullRequest
       33

Parallel.For в Python

4 голосов
/ 26 марта 2012

Есть ли что-то похожее на превосходный C # Parallel.For в Python?Я просто хочу сделать такой расчет, как

[simu(c) for c in clusterSizes]

параллельно.Какой самый простой способ архивировать это?

PS: я пробовал joblib, но в моих случаях он просто запускается, запускает и запускает процессы, пока мне не придется перезагружать мою машину.

Ответы [ 5 ]

7 голосов
/ 26 марта 2012

В Python 3 есть параллельная карта в concurrent.futures (в стандартной библиотеке).Я думаю, что он даже был перенесен в качестве модуля для Python 2.7. edit http://pypi.python.org/pypi/futures

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

edit из документов, это выглядит так просто:

with concurrent.futures.ProcessPoolExecutor() as executor:
    for result in executor.map(simu, clusterSizes)
        pass # save result
5 голосов
/ 26 марта 2012

joblib основан на multiprocessing и имеет ту же проблему в Windows , на которую @EwyynTomato указывает в комментариях: главная точка входа в скрипт должна быть защищена проверкой __name__ == "__main__".

from joblib import Parallel, delayed

if __name__ == "__main__":
    result = Parallel(n_jobs=-1)(delayed(simu)(c) for c in clusterSizes)
    # process result
0 голосов
/ 08 декабря 2014

Я написал небольшой пакет, который мог бы помочь:

from python-parallel-collections import parallel

#equal to [simu(c) for c in clusterSizes]
#performed in parallel using multiple processes
#the results are only evaluated on demand, such as with the call to list below
parallel_gen = parallel(clusterSizes)
lazy_results = parallel_gen.map(simu)
evaluated_results = list(lazy_results)

Это Python 2.7 и требует

pip install futures

pip install python-parallel-collections

дай мне знать, что ты думаешь https://github.com/gterzian/Python-Parallel-Collections

0 голосов
/ 26 марта 2012

в пакете multiprocessing вы можете создать объект Pool и использовать метод map:

см. http://docs.python.org/library/multiprocessing.html

Как и в JobLib, вы должныЗащитите основную точку входа с помощью __name__ == "__main__", иначе вы создадите бомбу-вилку (и вам потребуется перезагрузить компьютер при импорте сценария).

Функция, которую вы отображаете, должна быть доступна для выбора.

0 голосов
/ 26 марта 2012

Используйте другой язык.Из-за GIL (Global Interpreter Lock) не связанный с IO параллелизм в Python не очень эффективен.

...