Параллельная обработка в python для вычисления функции - PullRequest
0 голосов
/ 05 июня 2018

У меня тяжелый код, и его запуск занимает много времени.Я столкнулся со следующим кодом, но я действительно не знаю, как он работает.Рассмотрим def sigma(b) - огромную функцию в середине скрипта кода.Эта часть является основной причиной замедления выполнения кода.Мы используем результаты сигма-функции в других частях кода.Я просто поместил это в следующий код.

from multiprocessing import Pool
from multiprocessing import Process
import multiprocessing
def sigma(b):
    n=0
    for i in range (1,550):
        n=n+i+b
        return n
p = multiprocessing.Process(target=sigma)
p.start()

print(sigma(2))

Может ли кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 05 июня 2018

Один из способов сделать это (после исправления отступа sigma):

# -*- coding: utf-8 -*-
import multiprocessing as mp

def sigma(b):
    n=0
    for i in range (1,550):
        n=n+i+b
    return n

if __name__ == '__main__':
    inputs_b = [1, 2, 3, 4]

    with mp.Pool(processes = 2) as p:
        res = p.map(sigma, inputs_b)

Единственная проблема с многопроцессорностью - это то, что вы не можете запустить ее в IDE (например, spyder), поэтому вам нужночтобы сохранить результаты и получить их позже.

Это можно сделать с помощью numpy, pandas, pickle или др.

Тогда может потребоваться несколько аргументов.В этом случае используйте starmap():

# -*- coding: utf-8 -*-
import multiprocessing as mp

def sigma(a, b):
    n=0
    for i in range (1,550):
        n=n+i+b+a
    return n

if __name__ == '__main__':
    inputs_b = [(a,b) for a in range(5) for b in range(6, 10)]

    with mp.Pool(processes = 2) as p:
        res = p.starmap(sigma, inputs_b)

Примечание: processes = N дает число процессов, которые нужно открыть.Рекомендуется использовать количество физических процессоров или количество процессоров-1.

EDIT2: ваш фиктивный пример очень простой случай.У вас есть 2 варианта: написать свою функцию для выполнения элементарной задачи и распараллелить элементарные задачи ИЛИ заставить вашу большую функцию работать в течение 72 часов и запускать 4 или более одновременно на другом входе.

Вам также необходимоубедитесь, что процессы не используют общие ресурсы, иначе вам потребуется более сложная реализация.

Наконец, использование многопроцессорной обработки функций, генерирующих большое количество данных, может привести к ошибке памяти (недостаточно памяти).Это будет зависеть от приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...