【发布时间】:2017-07-07 09:14:45
【问题描述】:
我有两组数据:
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
...
而dict 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]}
但它的工作时间很长
【问题讨论】:
-
您可能想阅读minimal reproducible example,并相应地重新提出您的问题。
-
好的,我正在编辑我的问题
标签: python multiprocessing pool concurrent.futures