與dict我有兩個一組數據:嵌套循環並行輸出
aDict = {'barcode1': [('barcode1', 184), ('barcode1_mut', 2)], 'barcode2': [('barcode2', 138)], 'barcode3': [('barcode3', 375)]}
bList = [(('barcode1', 'mut1'), 184), (('barcode1_mut', 'mut2'), 2), (('barcode2', 'mut3'), 136), (('barcode2', 'mut4'), 1), (('barcode2', 'mut5'), 1), (('barcode3', 'mut6'), 373), (('barcode3', 'mut7'), 2)]
而且我在字典aDict在列表bList和結果一致的每一個鍵,帶條碼:
>>>print(result)
{'barcode1': {'barcode1': [('mut1', 184)], 'barcode1_mut': [('mut2', 2)]},
'barcode2': {'barcode2': [('mut3', 136), ('mut4', 1), ('mut5', 1)]},
'barcode3': {'barcode3': [('mut6', 373), ('mut7', 2)]}}
但它對我來說太慢了。我嘗試將代碼與輸出的處理行數信息進行並行處理。但在我的實施中,每條線都由所有工人同時處理。
現在,我的實現是這樣的:
from collections import defaultdict
import multiprocessing as mp
def f(uniqueBarcode):
mutBarcodeList = [x[0] for x in aDict[uniqueBarcode]]
a = filter(lambda x: x[0][0] in mutBarcodeList, bList.items())
d = defaultdict(tuple)
b = [(x[0][0], (x[0][1], x[1])) for x in a]
for tup in b: d[tup[0]] += (tup[1],)
result = {i[0]:[y for y in i[1]] for i in d.items()}
return result
seqDict={}
if __name__=='__main__':
cpus = mp.cpu_count()
pool = mp.Pool(cpus)
for barcode in aDict.keys():
seqDict[barcode] = pool.map(f, [barcode])
if len(seqDict) % 100 == 0:
print("Processed {} barcodes".format(len(seqDict)))
pool.close()
pool.join()
輸出:
Processed 100 barcodes
Processed 100 barcodes
Processed 100 barcodes
Processed 100 barcodes
Processed 100 barcodes
Processed 100 barcodes
Processed 100 barcodes
Processed 100 barcodes
Processed 200 barcodes
Processed 200 barcodes
Processed 200 barcodes
Processed 200 barcodes
Processed 200 barcodes
Processed 200 barcodes
Processed 200 barcodes
Processed 200 barcodes
...
而且字典seqDict是空的,但一定不會這樣 - 第一行第一處理過程中,第二行是第二行...第八行是第八行,第九行再行第一行等
如何正確地並行執行它?
Upd0:我適應Flomp的密碼給我
res={}
for key in aDict:
if len(aDict[key]) == 1:
res[key] = {key:[(a[1],b) for a,b in bList if a[0] == key]}
elif len(aDict[key]) > 1:
res[key] = {x[0]:[(a[1],b) for a,b in bList if a[0] == x[0]] for x in aDict[key]}
但它的工作這麼長時間
您可能想要閱讀[mcve],並相應地重新提出您的問題。 – boardrider
好吧,我在編輯我的問題 –