Почему класс пула в многопроцессорной обработке не дает преимущества перед линейной обработкой - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь измерить преимущество класса пула в многопроцессорном модуле по сравнению с обычным программированием, и я вычисляю квадрат числа с помощью функции. Теперь, когда я вычисляю время, необходимое для нахождения квадрата всех трех чисел, требуется около ~ 0,24 се c, но когда я обычно вычисляю его как a для l oop, это займет еще меньше ~ 0,007 сек c. Это почему? Разве часть кода с пулом не должна быть быстрее?

import time

from multiprocessing import Pool,Process

def f(x):
   return x*x

if __name__ == '__main__':

   start = time.time()
   array = []
   for i in range(1000000):
       array.append(i)

   with Pool(4) as p:
       (p.map(f, array))

   print(time.time()-start)  # time taken when using pool

   start1 = time.time()



   for i in range(1000000):
       f(array[i])



   print(time.time()-start1)   # time taken normaly



Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Проблема в том, что ваша функция для работников в пуле слишком проста, чтобы ее можно было улучшить с помощью параллелизма:

попробуйте это:

import time
from multiprocessing import Pool,Process

N = 80
M = 1_000_000

def f_std(array):
    """
    Calculate Standard deviation
    """
    mean = sum(array)/len(array)
    std = ((sum(map(lambda x: (x-mean)**2, array)))/len(array))**.5
    return std

if __name__ == '__main__':

    array = []
    for i in range(N):
        array.append(range(M))

    start = time.time()

    with Pool(8) as p:
        (p.map(f_std, array))
    print(time.time()-start)  # time taken when using pool


    start1 = time.time()

    for i in range(N):
        f_std(array[i])
    print(time.time()-start1)   # time taken normaly
0 голосов
/ 11 апреля 2020

Так что, как предложили @klaus D. и @wwii, у меня не было достаточно вычислений, чтобы преодолеть издержки процессов нереста и время, затрачиваемое на переключение между процессами. Ниже обновленный код, чтобы заметить разницу. Надеюсь, это поможет

import multiprocessing
import time
import random
from multiprocessing import Pool,Process

def f(x):
    time.sleep(3)

if __name__ == '__main__':


    array = []

    for i in range(4):
        array.append(i)

    start = time.time()

    with Pool(4) as p:
        (p.map(f, array))

    print(time.time()-start)  # time taken when using pool

    start1 = time.time()



    for i in range(4):
        f(array[i])



    print(time.time()-start1)   # time taken normaly



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