gpt4 book ai didi

Python 多处理比单处理慢

转载 作者:行者123 更新时间:2023-12-01 09:28:20 25 4
gpt4 key购买 nike

排序.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

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 核

多处理:[多处理图][/image/QksXf.png]

单线程:[单线程图][/image/9HYw7.png]

最佳答案

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

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

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

关于Python 多处理比单处理慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50177644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com