【问题标题】:Python: Parallel Processing in Joblib Makes the Code Run Even SlowerPython:Joblib 中的并行处理使代码运行更慢
【发布时间】:2018-03-25 23:53:36
【问题描述】:

我想集成一个并行处理以使我的 for 循环运行得更快。

但是,我注意到它让我的代码运行速度变慢了。请参阅下面的示例,其中我在随机整数列表中使用joblib 和一个简单的函数。请注意,没有并行处理比运行得更快。

对正在发生的事情有任何见解吗?

def f(x):
    return x**x

if __name__ == '__main__':
    s = [random.randint(0, 100) for _ in range(0, 10000)]


    # without parallel processing
    t0 = time.time()
    out1 = [f(x) for x in s]
    t1 = time.time()
    print("without parallel processing: ", t1 - t0)

    # with parallel processing
    t0 = time.time()
    out2 = Parallel(n_jobs=8, batch_size=len(s), backend="threading")(delayed(f)(x) for x in s)
    t1 = time.time()
    print("with parallel processing: ", t1 - t0)

我得到以下输出:

without parallel processing:  0.0070569515228271484
with parallel processing:     0.10714387893676758

【问题讨论】:

  • 并行处理涉及额外的开销,因为设置更复杂。您通常不希望将需要几微秒才能完成的任务并行化。
  • 我也在比较复杂的模糊匹配函数上试了一下,还是花了很长时间
  • 如果确实愿意了解发生了什么以及如何加快处理速度,请务必阅读上述链接中的论证和测试结果。 [并行]-调度不会免费带来加速,因此请让自己大量学习以性能为导向的设计技巧,并大量测试实际的附加成本与潜在的性能提升。 确实是一个激动人心的领域。

标签: python list loops parallel-processing joblib


【解决方案1】:

参数batch_size=len(s)实际上是说给每个进程一批s作业。这意味着您创建 8 个线程,然后将所有工作负载分配给 1 个线程。

此外,您可能希望增加工作量以获得可衡量的优势。我更喜欢使用 time.sleep 延迟:

def f(x):
    time.sleep(0.001)
    return x**x

out2 = Parallel(n_jobs=8,
                #batch_size=len(s),
                backend="threading")(delayed(f)(x) for x in s)

没有并行处理:11.562264442443848

并行处理:1.412865400314331

【讨论】:

  • 恕我直言,先生,在 f() 中添加 sleep 是根据阿姆达尔定律制造错误的幻觉。 [PARALLEL]-fraction ( 这里 ) 是如此之小,以至于 [SERIAL]-part 占主导地位,并且在 [PARALLEL]-section 中添加 sleep()- 不会提高处理性能,但会歪曲 [SERIAL]-part 的组成比较SER]+[PAR]/1 v/s [SER]+[PAR]/N。通过添加 sleep(),[PAR]-Setup 和 [PAR]-Terminate 开销的成本更加“掩盖”。
猜你喜欢
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2017-11-14
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多