我想使用多处理来生成马尔可夫链的转移矩阵。
函数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
包和一些示例,但我看到的示例是单个返回值而没有有序词典。我真的不明白如何在我的环境中应用它。有谁能告诉我这是如何工作的?
答案 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传递给你想要的形式。