我有这个示例代码。我正在进行一些数学计算(图论),我想提高速度,所以我决定采用多处理,但令人惊讶的是,相同的代码运行速度甚至比单一进程版本还慢。
我希望如果你有一个列表并将其分成两半并开始两个过程,那么它应该花费大约一半的时间。我不认为我有一些同步问题所以为什么这么慢?
from multiprocessing import Process, Queue
def do_work(queue, aList):
for elem in aList:
newList.append(a_math_function(elem))
queue.put(max(newList))
return max(newList)
def foo():
#I have let's say aList with 100000 objects
q1 = Queue(); q2 = Queue()
p1 = Process(target=do_work, args=[q1, aList[0: size/2])])
p2 = Process(target=do_work, args=[q2, aList[size/2+1: size])])
p1.start(); p2.start()
p1.join(); p2.join()
print(max(q1.get(),q2.get())
答案 0 :(得分:3)
不要使用多处理,而是尝试减少正在进行的分配量。您只需使用临时列表填充RAM(例如,您传递进程的aList的一半,然后是您在每个进程中创建的newList列表)。很可能这是缓慢的原因,因为大量的分配意味着大量的垃圾收集。
尝试用此替换所有代码并测量速度。
def foo():
print max(a_math_function(x) for x in aList)
答案 1 :(得分:2)
使用multiprocessing.Pool.map()在工作程序之间分配工作负载,并从中汇总结果。
请参阅下面的示例http://docs.python.org/library/multiprocessing.html#multiprocessing.pool.AsyncResult.successful