簡體   English   中英

將字典的鍵和值並行傳遞給 Function?

[英]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()一次一個。 在字典的情況下,元素是鍵。 因此,您將值012等傳遞給main()而不是grid_point值。 相反,您想直接對enumerate()的結果使用starmap() ) 。 中間字典不是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM