【问题标题】:Multiprocessing execution slower than serial execution多处理执行比串行执行慢
【发布时间】:2019-07-16 03:14:32
【问题描述】:

我正在尝试处理多处理,但在我的情况下,多处理似乎最终比串行执行慢。我尝试了下面发布的 sn-p,结果对我来说比较慢。我想使用我拥有的所有处理器来执行。还有一件事,有没有办法提升 for 循环和嵌套 for 循环。

import multiprocessing
import time

def add(a ,b ,c):
    d = 0
    for i in range(len(a)):
        d = a[i] + b + c
    return d

a = list()

for i in range(999999):
    a.append(i)

b = a[2] + a[9]
c = a[3] + a[8]

#Serial
execTime = time.time()
res = add(a, b, c)
print "Serial:    " + str(res) + " Exec Time: " + str(time.time() - execTime)

#Multiprocessing
execTimeMult = time.time()
resSet = [a, b, c]

cpu = multiprocessing.cpu_count()
pool = multiprocessing.Pool(cpu)
res = pool.apply(add, resSet)

print "Multiproc: " + str(res) + " Exec Time: " + str(time.time() - execTimeMult)

结果:

序列号:1000020 执行时间:0.0912199020386

多进程:1000020 执行时间:0.257400989532

【问题讨论】:

  • 有多少个核心?即,cpu 的值是多少?
  • 'cpu' 变量返回 4。
  • 这种特殊类型的计算可能会通过矢量化来加速。你有没有想过用 Numpy 解决这个问题?

标签: python python-2.7 python-multiprocessing


【解决方案1】:

这并不奇怪。 Pool.apply 函数在单独的进程中执行,这意味着一些事情。正如@tripleee 的回答所提到的,启动该过程存在开销,尽管我认为这并不能解释一切。 (这应该比较快,而且远低于 100 毫秒。)

要考虑的第二件事是需要一些数据传输,在本例中是一个大约 8Mb 的列表。这必须在管道上移动,包括对对象进行酸洗和解酸。

如果您在函数中执行了更多“工作”,您会看到相对差异下降,尽管常数因素相似。对于像下面这样的add 方法,我得到0.96s1.09s 的时间。所以相同的常数因子,但相对差异显然要小得多。

def add(a, b, c):
    for _ in range(10):
        d = 0
        for i in range(len(a)):
            d = a[i] + b + c
    return d

【讨论】:

  • 我同意你的观点,但我发布的 sn-p 只是描述。它非常精确,我拥有的实际代码很长。我将列表与其他静态内容一起传递给的函数在计算上非常繁重。该程序在执行时也会返回结果。串行比并行更快。
【解决方案2】:

这很容易解释,也是一个常见的常见问题解答:为每个微不足道的计算启动一个新进程的开销大大掩盖了并行执行的好处,尤其是在这种情况下,每次计算都有相当多的数据需要从调用者复制到执行者。

【讨论】:

  • 那么并行应该在什么情况下有效?
  • 当每个进程可以独立运行一段时间,并且不需要从调用者传递大量数据和/或再次返回时,并行执行肯定会提供性能改进.
  • 我真的很感激和示例或链接,因为我仍然对此感到困惑。还有一件事,假设如果我想执行几个相同的功能,是否可以同时执行它们。假设我想执行函数 'a' 4 次并且我有四个处理器,是否可以同时在所有 4 个单独的处理器上执行函数 'a'?
  • 这正是多处理的作用。计算在 I/O 上占主导地位的任何事情都应该很好地并行化。
  • Python 文档docs.python.org/2/library/… 似乎表明apply(甚至apply_async,但是它适合并行化)只使用池中的单个工作进程。因此,处理似乎只发生在单独的工作进程中,而不是真正的“多个进程”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多