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

时间:2016-03-21 14:16:48

标签: python dictionary python-multiprocessing markov-chains ordereddictionary

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

函数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包和一些示例,但我看到的示例是单个返回值而没有有序词典。我真的不明白如何在我的环境中应用它。有谁能告诉我这是如何工作的?

2 个答案:

答案 0 :(得分:2)

如果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的值相同的顺序,然后您可以使用以下内容构建您的dict:

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

如果transitionFunction可以以任何顺序应用您的州,那么您将获得不可预测的结果......

答案 1 :(得分:0)

似乎有一种在独立进程之间共享字典的解决方案。查看here是否有描述。恕我直言,这是处理问题的最简单方法。但是,此解决方案不支持OrderedDict。所以如果你能找到一种没有它们的方法,那就行了。也许你可以将你后来的dict传递给你想要的形式。