Будет ли многопроцессорная обработка хорошим решением для этой операции? - PullRequest
1 голос
/ 28 октября 2011
while True:

    Number = len(SomeList)

    OtherList = array([None]*Number)

    for i in xrange(Number):
        OtherList[i] = (Numpy Array Calculation only using i_th element of arrays, Array_1, Array_2, and Array_3.)

Число элементов Number в OtherList и других массивах можно рассчитать отдельно. Однако, поскольку программа зависит от времени, мы не сможем продолжить дальнейшую работу, пока не обработано каждое количество элементов Number.

Будет ли многопроцессорная обработка хорошим решением для этой операции? Я должен максимально ускорить этот процесс. Если это лучше, пожалуйста, предложите код, пожалуйста.

Ответы [ 2 ]

4 голосов
/ 29 октября 2011

Можно использовать массивы numpy с многопроцессорной обработкой , но пока не следует этого делать.

Чтение Руководство для начинающих по использованию Python для высокопроизводительных вычислений иего версия Cython: ускорение Python (NumPy, Cython и Weave) .

Не зная, каковы конкретные расчеты или размеры массивов, здесь приведены общие рекомендации в произвольном порядке:

  • измеряет производительность вашего кода.Найти горячие точки.Ваш код может загружать входные данные дольше, чем все вычисления.Установите свою цель, определите, какие компромиссы являются приемлемыми
  • проверьте с помощью автоматических тестов, что вы получите ожидаемые результаты
  • проверьте, можете ли вы использовать оптимизированные библиотеки для решения вашей проблемы
  • makeКонечно, алгоритм имеет достаточную сложность времени.Алгоритм O(n) в чистом Python может быть быстрее, чем алгоритм O(n**2) в C для больших n
  • , использующих срезы и векторизованные (автоматические циклы) вычисления, которые заменяют явные циклы в решении только для Python.
  • переписать места, которые нуждаются в оптимизации, используя weave, f2py, cython или аналогичные.Предоставить информацию о типе.Изучите параметры компилятора.Решите, стоит ли ускорение, чтобы сохранить расширения C.
  • минимизировать выделение и копирование данных.Сделайте его кеш дружественным.
  • выясните, могут ли несколько потоков быть полезными в вашем случае, например, cython.parallel.prange().Выпуск GIL.
  • Сравните с многопроцессорным подходом.Приведенная выше ссылка содержит пример того, как параллельно вычислять различные срезы массива.
  • Итерировать
0 голосов
/ 29 октября 2011

Поскольку у вас есть предложение while True, я предполагаю, что вы будете много работать, если итерации, так что потенциальные выгоды в конечном итоге перевесят замедление из-за нереста многопроцессорного пула.Я также предполагаю, что у вас есть более одного логического ядра на вашем компьютере по очевидным причинам.Тогда возникает вопрос, компенсируются ли затраты на сериализацию входных данных и десериализацию результата.

Лучший способ узнать, есть ли что-то, что можно получить, по моему опыту, это попробовать.Я хотел бы предложить, чтобы:

  • Вы передаете любые постоянные входные данные во время запуска.Таким образом, если любой из Array_1, Array_2, and Array_3 никогда не изменяется, передайте его как args при вызове Process().Таким образом, вы уменьшаете объем данных, которые необходимо выбрать и передать через IPC (что и делает multiprocessing)
  • Вы используете рабочую очередь и добавляете в нее задачи, как только они становятся доступны.Таким образом, вы можете быть уверены, что при выполнении задачи с задачей всегда будет больше работы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...