python - Python 中的多重处理并不比顺序处理快

标签 python multiprocessing

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

关于python - Python 中的多重处理并不比顺序处理快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37182868/

相关文章:

python - 在 Python 中使用闭包和动态定义的函数是一种自然的设计模式吗?

python - python文档中所有这些奇怪的括号是什么

python - Python 中 except 语句的排序

python - 如何一次在 Pandas 数据框中设置多个值?

Python多处理不调用函数

python - 正确实现 Python 多处理

python - 如何在odoo 9中逐行读取txt文件

虚拟名称与迭代器名称 : ill-advised? 相同的 Python 列表理解

python - 写入 CSV 文件时不带双引号

C 多处理/管道