Python:Joblib中的并行处理使代码运行更慢

时间:2017-10-13 19:26:15

标签: python list loops parallel-processing joblib

我希望集成并行处理,以使我的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

1 个答案:

答案 0 :(得分: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