Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 利用多重处理计算图上的最短路径_Python_Dictionary_Multiprocessing_Shortest Path - Fatal编程技术网

Python 利用多重处理计算图上的最短路径

Python 利用多重处理计算图上的最短路径,python,dictionary,multiprocessing,shortest-path,Python,Dictionary,Multiprocessing,Shortest Path,我目前有一个最短路径算法,它接收图形和原点节点作为输入,并返回图形中所有节点的成本加上树(每个节点的先决条件)。 图表是一本字典,成本和树也是 因为我必须计算所有节点中的最短路径树,所以并行计算是很自然的(因为树彼此独立) 我使用了一个使用多重处理的工作池,并将结果附加到一个列表中(因此我需要一个字典列表) 它运行时没有错误,但有趣的是,处理时间不随工作人员的数量而变化(根本没有变化) 任何关于为什么会发生这种情况的见解都将受到极大的赞赏。代码如下 from LoadData import *

我目前有一个最短路径算法,它接收图形和原点节点作为输入,并返回图形中所有节点的成本加上树(每个节点的先决条件)。 图表是一本字典,成本和树也是

因为我必须计算所有节点中的最短路径树,所以并行计算是很自然的(因为树彼此独立)

我使用了一个使用多重处理的工作池,并将结果附加到一个列表中(因此我需要一个字典列表)

它运行时没有错误,但有趣的是,处理时间不随工作人员的数量而变化(根本没有变化)

任何关于为什么会发生这种情况的见解都将受到极大的赞赏。代码如下

from LoadData import *
from ShortestPathTree import shortestPath
from time import clock, sleep
from multiprocessing import Pool, Process, cpu_count, Queue


def funcao(G,i):
    costs, pred=shortestPath(G,i)
    return pred


def main():

    #loads the graph
    graph="graph.graph"
    G = load_graph(graph)

    # loads the relevant nodes (CENTROIDS)
    destinations="destinations.graph"
    DEST = load_relevant_nodes(destinations)

    f = open('output_parallel.out','w')
    start=clock()


    pool=Pool()

    resultados=[]
    def adder(value):
        resultados.append(value)


    #for i in range(len(DEST)):
    for i in range(486):
        pool.apply_async(funcao, args=(G,DEST[i]), callback=adder)

    pool.close()
    pool.join()


    print clock()-start
    print >> f, resultados
    print >> f, 'seconds: '+ str(clock()-start)

原来@abarnert把它钉在了他的头上,他问每个电话花了多长时间。输入的数据中存在一个问题,使得每个呼叫都非常容易应答,因此为多个工作人员发送任务的开销补偿了性能的提高

The results I get now that the input data was corrected are:
1芯:185.0s 2芯:111.2s 3芯:96.6s 4芯:87.5s

在双核超读i7 620M Lenovo T410笔记本电脑上运行(Win 7 64位,Python 2.7.3)


感谢@abarnert的伟大洞察力

如果将
pool=pool()
替换为
pool=pool(processs=4)
,速度会更快吗?这不太可能,但有可能在
apply\u async
回调上进行序列化。请尝试
imap\u unordered
map\u async
。实际上,看起来您只是在手动模拟
map
,因此,更简单的是,您可以尝试一下……另外,您能给我们提供一个完整的可运行示例,它不需要您的自定义加载和图形处理代码,但确实演示了您的问题吗?我试图伪造这些函数,而我的版本显然与您使用的
apply_async
有关(pool=1需要1.12s,pool=4需要1.14s…但是当我切换到
map
时,pool=1需要0.83s,pool=4需要0.41s),但很难猜测您的测试用例是否如此。@abarnert,我尝试使用map,但无法找出如何为函数提供这两个参数(不断得到一个错误,即函数的参数数量错误)。你能提供你使用的测试代码吗?还有两个问题来排除不太可能但并非不可能的原因:第一,调用
funcao
需要多长时间,你在哪个平台上?如果算法足够短,并且您所处的平台进程启动和拆卸缓慢(如Windows),那么可以想象,启动8个进程而不是1个(或0个)足以抵消并行运行作业的好处。其次,
funcao
实际上是CPU受限,还是它的大部分时间都花在了其他地方?(即使它没有进行任何明显的I/O,使用足够的内存进行交换也会使您的磁盘受到限制…)