gpt4 book ai didi

Python 的多处理池没有预期的那么高效

转载 作者:太空宇宙 更新时间:2023-11-04 10:00:25 25 4
gpt4 key购买 nike

我有一个字典列表,我使用每个字典在一个图表上做一些处理。此处理在不返回任何内容的函数内完成。

没有 I/O 操作,也没有网络,它只是计算;基本上,每个字典代表图中的一条路径,我需要更新该路径的边权重。目前我不关心图形存储数据的一致性,我只是想改进处理时间。

我首先串行,在 for 循环中处理每个项目:

def processDict(dic, graph):
# Modify graph according to the data stored in the dictionary
# Returns nothing

def updatePheromone(listOfDicts):
# Graph is accesible within this function's scope
for dic in listOfDicts:
processDict(dic, graph)

然后我决定尝试并行化它,因为字典列表可能包含多达数万个词典,而且我可以在具有大量 CPU 的计算机上进行访问。我的第一次尝试是使用 threading 模块,但结果比串行版本差得多。在这里阅读 SO 和网络中的一些问题,由于 GIL,我遇到了一些使用 multiprocessing.Pool 类而不是线程的建议。结果比只使用线程要好,但串行版本仍然优于它(在四核 PC 上花费大约一半的时间!)。这是我为这个并行版本尝试过的:

from multiprocessing import Pool, cpu_count
from functools import partial


def updatePheromone(listOfDicts):
# Graph is accesible within this function's scope

pool = Pool()
partial_Func = partial(processDict, graph=graph)
pool.map_async(partial_Func, listOfDicts, len(listOfDicts)/cpu_count())
pool.close()

我觉得我在这种方法中遇到了问题。性能不佳是否与传递给 map 的函数是一种“void” 函数有关?我应该使用其他库或类吗?

编辑:我在 Linux 上运行它。

最佳答案

I feel I'm getting something wrong in this approach.

可能的原因是传入的数据过多。

进程不共享内存,因此您传入的任何数据都必须在一侧进行序列化,通过 channel (如原始套接字)传输,并在另一侧进行反序列化。如果花费的时间多于并行处理节省的时间,则结果是净损失。

处理此问题的一种技术是在创建池之前将内存中的图形作为全局变量(这样可以通过写时复制共享数据)。然后只需将索引(单个数字)传递给流程,让它在自己的图形部分上工作。

关于Python 的多处理池没有预期的那么高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43838400/

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