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