[英]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.