2016-11-02 3 views
0

У меня есть функция, которая может быть зациклирована 10 000 раз за 1 секунду. Однако мне нужно выполнить эту функцию десятки и сотни миллионов раз. Как и ожидалось из-за накладных расходов на использование процессоров, использование собственного пакета multiprocessing с четырьмя ядрами замедляет цикл 10k до 1,5 секунд. Использование параметра chunksize в multiprocessing помогло тривиально. Есть ли способ получить несколько процессов для вызова этой функции со скоростью, превышающей накладные расходы?Использование нескольких процессоров для очень быстрой функции в Python

усеченная версия функции:

rands = np.random.random((200, 1000000)) 

def randfunc(i): 
    Q = np.concatenate([rands[:,[i]], rands[:,[i]] * rands[:,[i+1]]],axis=1) 
    Q2 = np.dot(np.transpose(Q),Q) 
    Q3 = np.linalg.inv(Q2) * Q2[1,1] 
    return Q3 
+0

Вы используете Windows или ОС Unix? – Dunes

+0

У меня есть доступ к Windows и Ubuntu – evoclue

ответ

0

Я был в состоянии сократить время работы в два раза, используя ipyparallel пакет просто используя map_sync вместо multiprocessing пакета распараллелить функцию. Я не уверен, почему у прежнего пакета меньше накладных расходов, чем у последнего, но для первого, загрузка данных заняла много времени, в отличие от последнего, который распознает rands как переменную во время параллельного выполнения. Однако в обоих случаях данные хранятся в ОЗУ. Если кто-то читает это и знает причину, почему ipyparallel быстрее, сделайте комментарий.

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