Python 将字典的键和值并行传递给函数?

Python 将字典的键和值并行传递给函数?,python,arrays,dictionary,parallel-processing,multiprocessing,Python,Arrays,Dictionary,Parallel Processing,Multiprocessing,我试图使用多处理模块在Python中将字典的键和值并行传递给函数 我正在并行运行一系列数千次计算,主要函数最初采用一个数组,以笛卡尔形式描述分子坐标,然后对其进行一些处理。只需通过列表理解将数组列表映射到使用多处理池的函数即可 def main(grid_point): do stuff... if __name__ == "__main__": grid_points = [] # some list of arrays run_pool = mu

我试图使用多处理模块在Python中将字典的键和值并行传递给函数

我正在并行运行一系列数千次计算,主要函数最初采用一个数组,以笛卡尔形式描述分子坐标,然后对其进行一些处理。只需通过列表理解将数组列表映射到使用多处理池的函数即可

def main(grid_point):
    do stuff...

if __name__ == "__main__":
    grid_points = [] # some list of arrays
    run_pool = multiprocessing.Pool()
    run_pool.map(main, [grid_point for grid_point in grid_points])
# Works fine
然而,我希望存储一些特定于每个分子坐标的数据,以便存储值的顺序与并行计算之前列表中的初始索引相对应。注意,每次计算不会花费相同的时间运行,因此我可能会混淆数据

为了克服这个问题,我希望将字典中的每个key:value对并行地传递给函数。现在,键将对应于并行运行之前的原始索引,因此我有办法确保我的数据不会被扰乱

def main(gp_key, grid_point):
    do stuff...

if __name__ == "__main__":
    grid_points = [] # some list of arrays
    grid_points_map = {k: v for k, v in enumerate(grid_points)} # Dict of indexes and arrays
    run_pool = multiprocessing.Pool()
    run_pool.map(main, {gp_key: grid_point for gp_key, grid_point in grid_points_map})
# Does not work

任何关于如何最好地并行传递key:value对的见解都将是一个很大的帮助,甚至对于如何确保存储在末尾的数据与其原始索引相对应的任何建议都将是一个很大的帮助。我唯一能想到的另一种方法是使用pool将元组传递给函数,即
run\u pool.map(main,[(k,v)表示枚举(grid\u points)中的k,v)]
,然后将元组解压到
main()中的索引和数组中,作为
index,array=grid\u point
您正在使用的
run\u pool.map()
错误。当您执行
运行\u pool.map(main,…)
时,它会将每个元素从iterable传递到函数
main()
。对于字典,元素是键。因此,您将值
0
1
2
等传递到
main()
但不是
grid\u point
值。相反,您希望直接在
enumerate()
的结果上使用
starmap()
。不需要中间字典。

您使用的
run\u pool.map()
不正确。如果使用
run\u pool.map(main,…)
,它会将每个元素从iterable传递到函数
main()
,一次传递一个。在字典中,元素是键。因此,您要将值
0
1
2
等传递到
main()
,而不是
grid\u point
值。相反,您要使用
starmap()
直接在
enumerate()的结果上
。中间字典是不必要的。

我认为你的方法看起来不错。当你运行这段代码时会发生什么?你有一个
#不起作用的
注释,但不要解释这意味着什么。什么不起作用?你的代码的最终结果是什么?你希望它是什么?吹毛求疵:
grid\u points\u map
是冗余的。只需直接使用
枚举(网格点)
即可。您使用的
映射()
不正确。它一次将一项从iTable传递到
main()
函数。当您在字典上使用
映射()
时,您只能获得密钥。在这种情况下,您可能需要
星图()
而不是
映射()
。您可以将其直接用于
枚举(网格点)
正如我在前面的评论中提到的。我认为你的方法看起来不错。当你运行这段代码时会发生什么?你有一个
#不起作用的
评论,但不要解释这意味着什么。什么不起作用?你的代码的最终结果是什么?你希望它是什么?挑剔:
网格点图
是redu但丁。直接使用
枚举(网格点)
即可。您使用的
map()
不正确。它一次将一个项目从iteable传递到
main()
函数。当您在字典上使用
map()
时,您只能获得密钥。在这种情况下,您可能需要
starmap()
而不是
map()
。您可以直接使用
枚举(网格点)
,正如我在前面的评论中提到的。