Python 将字典的键和值并行传递给函数?
我试图使用多处理模块在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
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()
。您可以直接使用枚举(网格点)
,正如我在前面的评论中提到的。