gpt4 book ai didi

python - 多处理比顺序 Python 3.5 慢

转载 作者:行者123 更新时间:2023-11-28 22:31:43 25 4
gpt4 key购买 nike

我正在尝试使用 python 进行一些多处理来提高某些函数的速度,我知道创建一个进程的成本很高,但我的函数需要大约 3 秒才能按顺序执行,所以我在想一些多处理可以做到这一点。

我错了(天呐)多处理似乎更慢或者至少不是更快。在这里放置一些上下文,我在多处理之前有什么:

for i in range(0, 3):
for j in range(0, 3):
result = my_function(my_args)

现在我对多处理有什么看法:

pool = Pool()

for i in range(0, 3):
for j in range(0, 3):
result = pool.apply_async(my_function,my_args).get()

pool.close()
pool.join()

我用 my_function 东西替换了真正的函数,因为我的函数基本上很难阅读。

那么使用多处理的工作量是否很小,还是我做错了什么?

编辑:

正如一些人所说,它是按顺序工作的,因为我每次都在需要在加入后使用它的地方使用 get 但现在我有一个不时弹出的随机异常,这里是回溯的结尾:

文件“/home/rtodo/anaconda3/lib/python3.5/multiprocessing/pool.py”,第 608 行,在 get 提高 self 值(value)IndexError: 弹出索引超出范围

这是我修改过的代码

pool = Pool()
for i in range(0, 3):
for j in range(0, 3):
neigbhourhood[i][j] = pool.apply_async(my_function,my_args)



for k in range(0, 3):
for l in range(0, 3):
neigbhourhood[i][j] = neigbhourhood[i][j].get()

pool.close()

neigbhourhood 是一个 3x3 数组。

编辑的编辑:我更改了一些代码,现在池在 get 后关闭并且我不使用 join。

最佳答案

这两个示例没有(真正的)区别,因为 .get() 将等待进程完成。因此,您的多进程示例也将是顺序的,但它会花费更多时间,因为它会在不同节点上生成进程。

首先启动所有进程,然后等待结果。

pool = Pool()
futures = []
for i in range(0, 3):
for j in range(0, 3):
futures.append(pool.apply_async(my_function,my_args))

# You can also make some additional calculation here if you want

#
# Lets see if the multiprocess stuff is finished
for i in futures:
i.get()


pool.close()
# pool.join()

您也可以省略 .join(),因为主进程完成的时间不可能比子进程早。

关于python - 多处理比顺序 Python 3.5 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41444698/

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