为什么Python多处理会降低我的函数执行速度?

时间:2017-08-20 16:33:41

标签: python multithreading performance graph multiprocessing

我正在为Ubuntu上的python编写MinCut图形问题的代码,在证明单线程实现的正确性之后我试图使用多线程/多处理加速,但我的代码速度变慢了。 我注意到一个奇怪的行为,当我使用2个线程时,算法函数执行所花费的时间加倍,而单线程实现取消了拥有2个线程的增益,并且由于多处理开销实际上导致速度减慢而且我不能知道为什么,唯一可能的解释是我有一个单核心处理器,但事实并非如此,因为我的笔记本电脑配备了英特尔®酷睿™i5-6200U CPU @ 2.30GHz×4

数字

单线程:迭代时间(主要是randomContraction函数的运行时间)平均为200 ms

time allocation, rand sel time 0.00 collapse time 0.12 self loops time 0.08
iteration # 6882 of 211931 took time 0.20 Graph creation time 0.00 alg run time 0.20 elasped time 1439.17 total time 42797.71 progress 3.36 cut = 9

使用2个线程from multithreading import Thread:2个并行迭代次数平均为470 ms,因为函数速度从200 ms减慢到大约470 ms,因为我正在等待连接,所以将采取最坏的情况

time allocation, rand sel time 0.00 collapse time 0.22 self loops time 0.17
time allocation, rand sel time 0.00 collapse time 0.25 self loops time 0.16
iteration # 26 of 211931 took time 0.47 Graph creation time 0.05 alg run time 0.42 elasped time 6.62 total time 50250.92 progress 0.01 cut = None

使用2个进程from multiprocessing import Process:2个并行迭代时间平均为460毫秒,因为函数速度从200毫秒减慢到大约460毫秒,因为我正在等待连接,所以最糟糕的情况。

time allocation, rand sel time 0.00 collapse time 0.24 self loops time 0.16
time allocation, rand sel time 0.00 collapse time 0.24 self loops time 0.16
iteration # 48 of 211931 took time 0.46 Graph creation time 0.05 alg run time 0.41 elasped time 10.96 total time 48907.02 progress 0.02 cut = None

我的期望是2次迭代需要200 ms或稍微加倍我的代码速度但似乎现在randomContraction函数运行时间加倍,因此否定并行性的影响

代码

我删除了用于计算和记录时间的行以减少混乱

def randomContraction(G, cut, i):

    while G.numNodes() > 2 :
        edgeIndex = G.randEdgeIndex()
        G.collapse(edgeIndex)
        G.removeSelfLoops()

    cut[i] = G.cut()
    return 


def kragerMinCut(list):

    num_threads = 2
    elapsed = 0
    n = len(list)
    orig = Graph(list)
    iterations = int(n*n*math.log(n))
    threads = [None] * num_threads
    G = [None] * num_threads
    cut = [None] * iterations
    i = 0

    while i < iterations:

        for j in range(len(G)):
            G[j] = copy.deepcopy(orig)

        for j in range(len(threads)):
            threads[j] = Process(target=randomContraction, args=(G[j], cut, j+i))
            threads[j].start()

        for j in range(len(threads)):
            threads[j].join()


        i += num_threads

    print(cut)
    return min(cut)

0 个答案:

没有答案