繁体   English   中英

使用具有多个返回值和有序字典的多重处理

[英]Using multiprocessing with multiple return values and ordered dictionaries

我想使用多重处理来生成马尔可夫链的转移矩阵。

进行转换后,函数generateKeys()为状态空间中的每个状态生成具有新速率的字典和具有新键的字典。

from collections import OrderedDict

def generateKeys():
    idxDict = OrderedDict()
    rateDict = OrderedDict()
    for key,state in stateDict.items():            
        newkeys,rates = transitionFunction(state)              
        idxDict[key] = newkeys
        rateDict[key] = rates
    return idxDict,rateDict

在这里使用OrderedDict的原因是,下一步将键与常规dict混合使用(在下一步中,我将字典中的numpy数组连接起来并存储在稀疏的coo_matrix中)。

由于字典键是唯一的,因此应该可以并行运行generateKeys()并在多核计算机上更快地填充两个字典。

我研究了multiprocessing程序包和一些示例,但是我看到的示例是针对单个返回值且没有有序字典的。 我还不太了解如何在我的环境中应用它。 谁能告诉我这是如何工作的?

如果transitionFunction可以按任何顺序应用状态:

transitionFunction('A')
transitionFunction('B')

# is equivalent to
transitionFunction('B')
transitionFunction('A')

您可以使用:

from multiprocessing import Pool, cpu_count

p = Pool(cpu_count())
results = p.map(transitionFunction, stateDict.values())

results将与stateDict的值具有相同的顺序,然后可以使用以下命令构建字典:

idxDict = dict(zip(stateDict.keys(), i[0] for i in results))
rateDict = dict(zip(stateDict.keys(), i[1] for i in results))

如果transitionFunction 无法以任何顺序应用状态,那么您将得到不可预测的结果...

似乎存在一种在独立进程之间共享字典的解决方案。 在这里寻找说明。 恕我直言,这是处理您的问题的最简单方法。 但是,此解决方案不支持OrderedDict 因此,如果您能找到一种无需他们的方法,那就行得通。 也许您以后可以将您的口述通过/转换为所需的形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM