Как ускорить использование multiprocessing/process_map и др. с тяжелыми вычислениями в Python (например, numpy)? ⇐ Python
Как ускорить использование multiprocessing/process_map и др. с тяжелыми вычислениями в Python (например, numpy)?
У меня есть функция, написанная на Numpy, каждый вызов которой занимает около 2 секунд, но мне приходится запускать ее десятки тысяч раз. Очевидно, что мне следует использовать многопоточность или многопроцессорность, и самый простой способ — использовать process_map или thread_map в tqdm.contrib.concurrent. Но я обнаружил, что это работает не так, как ожидалось.
Вот пример, который я проверил:
время импорта импортировать numpy как np из tqdm.auto импортировать tqdm из tqdm.contrib.concurrent импорта Process_map, thread_map def mydataset(размер, длина): для ii в диапазоне (длина): выход np.random.rand(*размер) защита расчет (мат): # симулируем тяжелые вычисления для ii в диапазоне (1000): avg = np.mean(mat) станд = np.std(мат) вернуть среднее, стандартное защита основной(): ds = список(mydataset((500,500), 100)) t0 = время.время() рез1 = [] для мата в tqdm(ds): res1.append(calc(mat)) print(f'for цикл: {time.time() - t0}s') t0 = время.время() res2 = список(карта(calc, tqdm(ds))) print(f'родная карта: {time.time() - t0}s') t0 = время.время() res3 = карта_процесса (расчет, дс) print(f'карта процесса: {time.time() - t0}s') t0 = время.время() res4 = thread_map(calc, ds) print(f'threadmap: {time.time() - t0}s') проходить если __name__ == '__main__': основной() И получилось:
100%|███████████████████████████████ ██████████████| 100/100 [00:51
У меня есть функция, написанная на Numpy, каждый вызов которой занимает около 2 секунд, но мне приходится запускать ее десятки тысяч раз. Очевидно, что мне следует использовать многопоточность или многопроцессорность, и самый простой способ — использовать process_map или thread_map в tqdm.contrib.concurrent. Но я обнаружил, что это работает не так, как ожидалось.
Вот пример, который я проверил:
время импорта импортировать numpy как np из tqdm.auto импортировать tqdm из tqdm.contrib.concurrent импорта Process_map, thread_map def mydataset(размер, длина): для ii в диапазоне (длина): выход np.random.rand(*размер) защита расчет (мат): # симулируем тяжелые вычисления для ii в диапазоне (1000): avg = np.mean(mat) станд = np.std(мат) вернуть среднее, стандартное защита основной(): ds = список(mydataset((500,500), 100)) t0 = время.время() рез1 = [] для мата в tqdm(ds): res1.append(calc(mat)) print(f'for цикл: {time.time() - t0}s') t0 = время.время() res2 = список(карта(calc, tqdm(ds))) print(f'родная карта: {time.time() - t0}s') t0 = время.время() res3 = карта_процесса (расчет, дс) print(f'карта процесса: {time.time() - t0}s') t0 = время.время() res4 = thread_map(calc, ds) print(f'threadmap: {time.time() - t0}s') проходить если __name__ == '__main__': основной() И получилось:
100%|███████████████████████████████ ██████████████| 100/100 [00:51
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение