gpt4 book ai didi

python - 从多处理 python 函数中提取输出

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:41 25 4
gpt4 key购买 nike

我想知道如何从 Python 中的多处理函数中提取输出。我是多处理新手,对它的工作原理了解有限(但不是因为缺乏尝试)。

我需要使用 InfForecast 和 InitialStorage 的 31 个不同输入来运行优化(目前...可能最多有 10,000 个输入并且正在执行独立优化)。我希望我可以使用多重处理来加快处理速度,一次处理多个独立优化。我想要的是将输出(每个优化有 5 个值)放入数组“Nextday”中,该数组的尺寸应为 (5,31)。我编写的代码的 Nextday 输出似乎是空的或不可访问的。如何提取/访问这些值并将其放入 Nextday?

注意:函数 main(...) 是一个高度复杂的优化问题。我希望这个问题足够容易理解,而无需提供它。当我循环它并为 range(31) 中的每个 i 调用它时,它就起作用了。

from multiprocessing.pool import ThreadPool as Pool
Nextday=np.zeros((5,31))
pool_size = 4 # Should I set this to the number of cores my machine has?
pool = Pool(pool_size)

def optimizer(InfForecast, InitialStorage):
O=main(InfForecast,InitialStorage)
return [O[0][0], O[0][1], O[0][2], O[0][3], O[0][4]]


for i in range(31):
pool.apply_async(optimizer, (InfForecast[i],InitialStorage[i]))

pool.close()
Nextday=pool.join()

除此之外,我不确定这是否是最好的做事方式。如果它有效(我不确定它是否有效),那么它看起来肯定很慢。我读到,进行多处理与线程处理可能会更好,这似乎是线程处理?如果我错了,请原谅我。

我也很好奇如何选择 pool_size,正如您在代码中的评论中看到的那样。我最终可能会在云服务器上运行它,所以我希望在那里使用的 pool_size 会与我在自己的计算机上使用的数字略有不同。只是核心数量吗?

如有任何建议,我们将不胜感激。

最佳答案

你应该使用

from multiprocessing.pool import Pool

如果你想进行多处理。

如果您拥有自己的机器,池大小应从 multiprocessing.cpu_count() 开始,并手动调整以获得最佳效果。如果你的进程受 cpu 限制,那么保留一个可用的核心将使你的机器响应更快——如果你的代码不受 cpu 限制,你可以拥有比核心更多的进程(尽管调整这一点很挑剔,你只需要尝试)。

在进行多重处理时(或任何其他时间),文件的最顶层不应有任何代码。将所有内容放入函数中并从以下位置调用启动函数:

if __name__ == "__main__":
my_start_function()

(题外话:使用大写的 oh 作为变量名确实很糟糕,并且你得到的语句在某些字体中几乎无法阅读,例如 O[0][0])。

在常规 Python 中,map 函数是通过以下等式“定义”的:

map(fn, lst) == [fn(item) for item in lst]

因此 Pool 方法 (imap/imap_unordered/map/map_async) 具有类似的语义,在您的情况下,您可以这样调用它们:

def my_start_function():
...
results = pool.map(optimizer, zip(InfForecast, InitialStorage))

由于映射函数采用一个函数和一个列表,因此我使用了 zip 函数来创建一个列表,其中每个项目的每个参数都有一个元素(它的功能就像一个 zipper )。

关于python - 从多处理 python 函数中提取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46124547/

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