使用具有多个 return 值和有序字典的多处理

Using multiprocessing with multiple return values and ordered dictionaries

我想使用 multiprocessing 生成马尔可夫链的转移矩阵。

函数 generateKeys() 为状态 space 中的每个状态生成一个具有新速率的字典和一个具有新键的字典。

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 包和一些示例,但我看到的示例是针对单个 return 值且没有有序字典的。我还不太明白如何在我的环境中应用它。谁能告诉我这是如何工作的?

似乎有一个在独立进程之间共享字典的解决方案。寻找 here 的描述。恕我直言,这是处理您的问题的最简单方法。但是,此解决方案不支持 OrderedDict。所以如果你能找到一种没有它们的方法,那就行得通了。也许你可以 pass/transform 你事后口述成想要的形式。

如果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可以不能以任何顺序应用你的状态,那么你将得到不可预知的结果...