我想要并行做一些事情,但总是变慢。我举了两个可以比较的代码片段的例子。多处理方式在我的笔记本电脑上需要12秒。顺序方式只需3秒。我认为多处理更快。 我知道以这种方式完成的任务没有任何意义,但只是比较两种方式。我知道冒泡排序可以用更快的方式取代。
感谢。
多处理方式:
from multiprocessing import Process, Manager
import os
import random
myArray = []
for i in range(1000):
myArray.append(random.randint(1,1000))
def getRandomSample(myset, sample_size):
sorted_list = sorted(random.sample(xrange(len(myset)), sample_size))
return([myset[i] for i in sorted_list])
def bubbleSort(iterator,alist, return_dictionary):
sample_list = (getRandomSample(alist, 100))
for passnum in range(len(sample_list)-1,0,-1):
for i in range(passnum):
if sample_list[i]>alist[i+1]:
temp = alist[i]
sample_list[i] = alist[i+1]
sample_list[i+1] = temp
return_dictionary[iterator] = sample_list
if __name__ == '__main__':
manager = Manager()
return_dictionary = manager.dict()
jobs = []
for i in range(3000):
p = Process(target=bubbleSort, args=(i,myArray,return_dictionary))
jobs.append(p)
p.start()
for proc in jobs:
proc.join()
print return_dictionary.values()
另一种方式:
import os
import random
myArray = []
for i in range(1000):
myArray.append(random.randint(1,1000))
def getRandomSample(myset, sample_size):
sorted_list = sorted(random.sample(xrange(len(myset)), sample_size))
return([myset[i] for i in sorted_list])
def bubbleSort(alist):
sample_list = (getRandomSample(alist, 100))
for passnum in range(len(sample_list)-1,0,-1):
for i in range(passnum):
if sample_list[i]>alist[i+1]:
temp = alist[i]
sample_list[i] = alist[i+1]
sample_list[i+1] = temp
return(sample_list)
if __name__ == '__main__':
results = []
for i in range(3000):
results.append(bubbleSort(myArray))
print results
答案 0 :(得分:1)
如果您有多个内核并正确进行并行化,则多处理速度会更快。在您的示例中,您创建了3000个进程,这些进程会在它们之间切换上下文。而不是使用Pool
来安排进程的作业:
def bubbleSort(alist):
sample_list = (getRandomSample(alist, 100))
for passnum in range(len(sample_list)-1,0,-1):
for i in range(passnum):
if sample_list[i]>alist[i+1]:
temp = alist[i]
sample_list[i] = alist[i+1]
sample_list[i+1] = temp
return(sample_list)
if __name__ == '__main__':
pool = Pool(processes=4)
for x in pool.imap_unordered(bubbleSort, (myArray for x in range(3000))):
pass
我删除了所有输出并在我的4核机器上进行了一些测试。正如预期的那样,上面的代码比顺序示例快4倍。
答案 1 :(得分:0)
多处理不仅神奇地更快。问题是您的计算机仍然需要完成相同的工作量。就像你试图同时做多个任务一样,它不会更快。
在“普通”程序中,顺序执行它更容易阅读和写入(它更快一点也让我感到惊讶)。如果您必须等待另一个进程(如Web请求(您可以一次发送多个而不必等待每个进程)或具有某种事件循环,则多处理尤其有用。 我猜测为什么它更快是因为Python已经在内部使用多处理(只要它有意义)(不要引用我)。还有线程,它必须跟踪什么在哪里,这意味着更多的开销。
所以,如果我们回到现实世界中的例子,如果你给别人一个任务,而不是等待它,你可以同时做其他事情,那么你就更快。