Sort.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)
Parallel.py
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个内核
多重处理:多重处理的图形
单线程:单线程图形
发布于 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-workers和https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool)
然而,这并不能解释为什么简单地将工作分派到另一个进程会导致较慢的运行时。(值得注意的是,在我的MacBook专业版上,简单版本和“并行”版本在执行时间上没有区别。)速度慢的原因是进程之间的通信。您要求它通过它的IPC通道传输一个大的列表,而它这样做显然效率不高。您可以自己进行演示:将列表创建和混洗移动到bubble_sort_parallel
中,并将pool.apply_async
中提供的函数的参数设为空列表。在我的计算机上,这使得运行时与基本版本完全相同。
发布于 2018-05-04 23:43:36
我试过用N=15000
。在我的电脑上,它的工作时间几乎相同,也就是说,非并行版本在26秒内对一个数组进行排序。并行版本在28秒内对两个数组进行排序。我设置了pool = Pool(2)
。您是否尝试过增加N,也许您的结果与环境中较大的N值具有可比性。
附注:您还应该记住,生成进程也需要资源,并且涉及到一些同步工具。
https://stackoverflow.com/questions/50177644
复制相似问题