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,使用足够的内存进行交换也会使您的磁盘受到限制…)