首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python多处理比单一处理慢

Python多处理比单一处理慢
EN

Stack Overflow用户
提问于 2018-05-04 22:48:35
回答 2查看 662关注 0票数 2

Sort.py

代码语言:javascript
运行
复制
import random
import time

def time_analysis(func):
    def do_func(*args, **kwargs):
        print('[INFO] \'{}\' analysis started (N={}).'.format(func.__name__, len(args[0])))
        start_time = time.clock()
        result = func(*args, **kwargs)
        end_time = time.clock()
        total_time = end_time - start_time
        print('[INFO] \'{}\' took {} seconds (N={}).'.format(func.__name__, total_time, len(args[0])))
        return result

    return do_func


@time_analysis
def bubble_sort(num_list):
    num_len = len(num_list)
    for i in range(num_len - 1):
        for j in range(num_len - i - 1):
            if num_list[j] > num_list[j + 1]:
                num_list[j], num_list[j + 1] = num_list[j + 1], num_list[j]
    return num_list

if __name__ == '__main__':
    N = 30000
    random_list = list(range(N))
    random.shuffle(random_list)
    bubble_sort(random_list)

    random_list = list(range(N))
    random.shuffle(random_list)
    bubble_sort(random_list)

Parallel.py

代码语言:javascript
运行
复制
from multiprocessing import Pool, cpu_count
from Sort import *

def bubble_sort_parallel(*args, **kwargs):
    return bubble_sort(*args, **kwargs)

if __name__ == '__main__':
    N = 30000
    random_list = list(range(N))
    random.shuffle(random_list)
    pool.apply_async(bubble_sort_parallel, (random_list,))
    random_list = list(range(N))
    random.shuffle(random_list)
    pool.apply_async(bubble_sort_parallel, (random_list,))

    pool.close()
    pool.join()

单线程只用了2秒,而多处理用了8秒。

N= 300,000。单线程只用了200秒,但多处理用了1400秒。

为什么使用多进程要比使用单线程慢?

我怎样才能提高性能?

平台: Linux,pypy2.7-5.10.0,我的电脑上有4个内核

多重处理:多重处理的图形

单线程:单线程图形

EN

回答 2

Stack Overflow用户

发布于 2018-05-05 01:11:29

我希望您已经清楚这一点:Pool.apply_async允许您将工作分派到池中的其他进程;它不会自动并行化单个函数。换句话说,这两个版本都是在单个核心上的单个线程中执行每个排序。并行版本应该将两个排序调用分派到两个内核,但您测量的是每个排序的运行时,而不是整个程序的执行时间,因此您不会通过两个排序调用的重叠检测到任何节省。(此外,目前,您的代码不包括创建pool对象,所以我只是假设您在N>2时使用了processes=N --尽管,同样,这也无关紧要,因为您测量的不是整体运行时,而是每种类型的运行时。)

(如果没有,请参阅https://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workershttps://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool)

然而,这并不能解释为什么简单地将工作分派到另一个进程会导致较慢的运行时。(值得注意的是,在我的MacBook专业版上,简单版本和“并行”版本在执行时间上没有区别。)速度慢的原因是进程之间的通信。您要求它通过它的IPC通道传输一个大的列表,而它这样做显然效率不高。您可以自己进行演示:将列表创建和混洗移动到bubble_sort_parallel中,并将pool.apply_async中提供的函数的参数设为空列表。在我的计算机上,这使得运行时与基本版本完全相同。

票数 2
EN

Stack Overflow用户

发布于 2018-05-04 23:43:36

我试过用N=15000。在我的电脑上,它的工作时间几乎相同,也就是说,非并行版本在26秒内对一个数组进行排序。并行版本在28秒内对两个数组进行排序。我设置了pool = Pool(2)。您是否尝试过增加N,也许您的结果与环境中较大的N值具有可比性。

附注:您还应该记住,生成进程也需要资源,并且涉及到一些同步工具。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50177644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档