在排序.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]在
我试过
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-workers 和 https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool)
然而,这并不能解释为什么简单地将工作分派到另一个进程会导致运行时变慢。(值得注意的是,在我的MacBookPro上,简单版本和“并行”版本在执行时间上没有区别。)进程之间的通信是缓慢的原因。你要求它通过IPC通道传送一个大名单,显然这样做效率不高。您可以自己演示一下:将列表创建和洗牌移动到
bubble_sort_parallel
中,并将参数设置为pool.apply_async
中提供的函数的空列表。在我的计算机上,这使得运行时与基本版本相同。在相关问题 更多 >
编程相关推荐