2017-10-19 267 views
0

所以我有一個函數,它只通過兩個參數對幾個.txt文件執行一些操作。它目前正在按預期工作,但我在近一個小時內就完成了10%的東西 - 所以需要一些時間,因爲.txt文件相當大。具有兩個參數的函數的多處理(池)

現在,我已經閱讀了關於程序包多重處理的內容,尤其是其中的Pool段。但是,我不太清楚我如何正確使用它。

我用它來運行我的函數的代碼如下:

for k, structure in enumerate(structures): 
    structure_maker(structure_path, structure) 

structure_path始終是相同的,而structures是不同值的列表,如:

structures = [1, 3, 6, 7, 8, 10, 13, 25, 27] 

所以我將如何去使用這個池進程? 至於我可以閱讀我必須做一些事情,如:

from multiprocessing import Pool 

mypool = Pool(6) # Choosing how many cores I want to use 
mypool.map(structure_maker, list) 

而且list是我迷路。那應該是什麼? structures列表,如果是的話,我在哪裏可以放入我的structure_path

回答

1

Pool.map()函數類似於內置map()功能呢,換句話說,它適用傳遞給它的可迭代傳遞給它的第二個參數的參數給每個項目的功能。每次調用提供的函數時,它都會將該迭代中的下一個項目作爲該函數的參數單一參數提供。

這種情況下的一個潛在問題是您要使用的函數structure_maker()需要兩個參數。對此有不同的解決方法,但在這種情況下,由於其中一個參數始終是相同的,所以可以使用functools.partial()函數來創建只需要將第二個參數傳遞給它的臨時函數 - 並且您可以執行此操作請致電mypool.map()

這裏就是我的意思是:

from multiprocessing import Pool 

def structure_maker(structure_path, structure): 
    """ Dummy for testing. """ 
    return structure_path, structure 

if __name__ == '__main__': 

    from pprint import pprint 
    from functools import partial 

    mypool = Pool(4) 
    structure_path = 'samething' 
    structures = [1, 3, 6, 7, 8, 10, 13, 25, 27] 
    results = mypool.map(partial(structure_maker, structure_path), structures) 
    pprint(results) 

輸出:

[('samething', 1), 
('samething', 3), 
('samething', 6), 
('samething', 7), 
('samething', 8), 
('samething', 10), 
('samething', 13), 
('samething', 25), 
('samething', 27)] 
0

您可能需要製作並解壓縮tuple

def structure_maker_proxy(args): 
    structure_path, structure = args 
    structure_maker(structure_path, structure) 


from multiprocessing import Pool 

mypool = Pool(6) # Choosing how many cores I want to use 

lis = [(structure_path, struct) for struct in structures] 
mypool.map(structure_maker_proxy, lis) 
相關問題