[英]Passing Keys and Values of a Dictionary to a Function in Parallel?
我正在嘗試使用多處理模塊在 Python 中將字典的鍵和值並行傳遞給 function。
我正在並行運行一系列數千次計算,主要的 function 最初采用一個以笛卡爾形式描述分子坐標的數組,然后用它做一些事情。 只需使用多處理池通過列表理解將 arrays 列表映射到 function 就可以了。
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
但是,我希望存儲一些特定於每個分子坐標的數據,以便在並行計算之前存儲值的順序對應於它們在列表中的初始索引。 請注意,每次計算都不會花費相同的時間來運行,因此我可能會混淆數據。
為了克服這個問題,我希望將字典的每個鍵:值對並行傳遞給 function。 現在密鑰將對應於並行運行之前的原始索引,因此我有辦法確保我的數據不會被打亂。
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
任何關於如何最好地傳遞密鑰的見解:並行值對將是一個很大的幫助,甚至任何關於如何確保最終存儲的數據與其原始索引相對應的建議。 我能想到的唯一其他方法是使用池將元組傳遞給 function 即run_pool.map(main, [(k, v) for k, v in enumerate(grid_points)]
然后將元組解包到索引中和main()
中的數組作為index, array = grid_point
。
您使用run_pool.map()
不正確。 當您執行run_pool.map(main, ...)
時,它會將每個元素從可迭代對象傳遞到 function main()
一次一個。 在字典的情況下,元素是鍵。 因此,您將值0
、 1
、 2
等傳遞給main()
而不是grid_point
值。 相反,您想直接對enumerate()
的結果使用starmap()
) 。 中間字典不是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.