2016-05-12 73 views
1

我想要并行执行某些操作,但总是会变慢。我举了两个可以比较的代码片段的例子。我的笔记本电脑需要12秒的多处理方式。顺序的方式只有3秒。我认为多处理速度更快。 我知道这样做的任务没有任何意义,但只是比较两种方式。我知道冒泡排序可以用更快的方式取代。Python中的多处理并不比按顺序执行更快

谢谢。

多处理方式:

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 

回答

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倍。

+0

非常感谢。 所以一个普通的电脑(我有一个Mac-Air)只有一个核心,因此当我在其上执行程序时,我不能从多处理中受益?但是如果我在多内核计算机上执行操作,我会受益吗? – TheOnlyOne11

+0

@ TheOnlyOne11:如果您的计算机只有一个内核,您将不会从这种情况下的多处理中受益。如果你有多个内核,你将会受益,正如我在回复中写道的那样,我的四核心机器在四分之一时间内完成了测试。 – niemmi

0

多重不只是奇迹般地速度更快。问题是你的电脑还是要做同样的工作。这就好像你试图一次完成多个任务一样,这不会更快。

在一个“正常”程序中,顺序执行更容易阅读和编写(它的速度太快了,我也有点惊讶)。如果您必须等待Web请求等其他进程(您可以一次发送多个并且不必等待每个进程)或进行某种事件循环,那么多重处理特别有用。 我的猜测是为什么它更快,Python已经在内部使用多处理,只要它有意义(不要引用我的话)。另外,线程必须跟踪什么地方,这意味着更多的开销。因此,如果我们回到现实世界中的例子,如果您将任务交给其他人,而不是等待它,那么您可以同时做其他事情,那么您就会更快。