繁体   English   中英

Python 中的多处理并不比顺序执行快

[英]Multiprocessing in Python not faster than doing it sequentially

我想同时做一些事情,但它总是变慢。 我举了一个可以比较的两个代码片段的例子。 在我的笔记本电脑上,多处理方式需要 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

如果您有多个内核并正确执行并行化,则多处理速度会更快。 在您的示例中,您创建了 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 倍。

多处理不仅仅是神奇地更快。 问题是您的计算机仍然必须执行相同数量的工作。 就像如果您尝试一次执行多项任务,速度不会更快。

在“普通”程序中,按顺序执行更容易读写(它的速度快得多让我有点惊讶)。 如果您必须等待另一个进程,例如 Web 请求(您可以一次发送多个而不必等待每个)或具有某种事件循环,则多处理特别有用。 我对为什么它更快的猜测是 Python 已经在内部使用了多处理,只要它有意义(不要引用我的话)。 此外,对于线程,它必须跟踪什么在哪里,这意味着更多的开销。

所以,如果我们回到现实世界中的例子,如果你把任务交给别人,而不是等待它,你和他们同时做其他事情,那么你会更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM