2016-05-07 11 views
1

Чтобы улучшить код, который имеет один тяжелый цикл, мне нужна скорость. Как я могу реализовать многопроцессорность для такого кода? (А является типичным размером 2 и л до 10)Многопроцессорные вложенные петли питона

for x1 in range(a**l): 
    for x2 in range(a**l): 
     for x3 in range(a**l): 
      output[x1,x2,x3] = HeavyComputationThatIsThreadSafe1(x1,x2,x3) 
+0

Комментарий ShadowRanger на [ваш другой вопрос] (http://stackoverflow.com/q/37081288/1461210) по-прежнему стоит - все потоки в мире не будут делать большую часть вмятин, если вы привержены вызывая 'HeavyComputThatIsThreadSafe1' * более миллиарда раз *. Сколько секунд занимает один вызов «HeavyComputThatIsThreadSafe1»? Возьмите это число, умножьте его на 1073741824 и разделите на количество ядер, которые у вас есть. Это дает вам абсолютное время исполнения сценариев, которое вы можете достичь с помощью многопроцессорной обработки. –

+0

Я рассмотрел проблемы производительности с помощью «HeavyComputThatiIsThreadSafe» в [исходном вопросе] (http://stackoverflow.com/a/37100607/392949), с которым вы связались. Даже с указанным размером данных требуется всего ~ 8 ГБ памяти и 45 секунд для прохождения всех трех вложенных циклов, если вы возьмете несколько разумных наборов оптимизации. – JoshAdel

ответ

2

Если функция HeavyComputationThatIsThreadSafe1 использует только массивы и не питона объектов, я бы с помощью concurrent futures (или python2 backport) ThreadPoolExecutor вместе с Numba (или cython) с выпущенным GIL. В противном случае используйте ProcessPoolExecutor.

См:

http://numba.pydata.org/numba-doc/latest/user/examples.html#multi-threading

Вы хотели бы распараллелить вычисления на уровне внешней петли и затем заполнить output из кусков в результате каждой нити/процесса. Это предполагает, что затраты на это намного дешевле, чем вычисление, что должно быть так.

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