【问题标题】:Why pool class in multiprocessing is not giving advantage over linear processing为什么多处理中的池类没有优于线性处理
【发布时间】:2020-04-11 14:05:53
【问题描述】:

我正在尝试衡量 multiprocessing 模块 中的 pool class 相对于普通编程的优势,并且我正在使用函数计算数字的平方。现在,当我计算找到所有三个数字的平方所需的时间时,大约需要 ~0.24 秒,但是当我在 for 循环中正常计算时,它需要的时间甚至更少 ~0.007 秒。这是为什么?带池的代码部分不应该更快吗?

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



【问题讨论】:

  • 你的任务太简单了。创建流程的开销将吞噬所有优势。
  • 那么我应该对此进行哪些更改才能具有重要价值,请帮助
  • 给它一些重要的工作。通常所有花费超过 100 毫秒的事情都会更糟地产生一个进程。
  • 如果您只是想看看不同之处,请将time.sleep(3) 添加到函数中。
  • 你不必产生更多的进程,你必须给他们更长的运行时间。

标签: python python-multiprocessing


【解决方案1】:

正如@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



【讨论】:

    【解决方案2】:

    问题是你在池中的worker函数太简单了,无法通过并行来改进:

    试试这个:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      相关资源
      最近更新 更多