Python多处理速度比sing慢

2024-04-20 04:59:22 发布

您现在位置:Python中文网/ 问答频道 /正文

在排序.py在

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)

在并行.py在

^{pr2}$

单线程只需2秒,而多处理只需8秒。在

N=300000。单线程只花了200秒,而多处理只花了1400秒。在

为什么使用多处理比单线程慢?在

我怎样才能提高绩效?在

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

多处理: 【图形多重处理】[https://gurksf.png.com网站]在

单线程: 【单螺纹图】[https://i.stack.imgur.com/9HYw7.png]在


Tags: namepylenreturntimedefargsrange
2条回答

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

另外,您还应该记住,生成过程也需要资源,并且需要一些同步工具。在

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

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

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

相关问题 更多 >