我试图评估随机游走结束位置的概率,但我在计划速度方面遇到了一些麻烦。基本上,我想要做的是将包含随机游走概率的字典作为输入(例如p = {0:0.5,1:0.2。-1:0.3},这意味着X保持在50%的概率0,20%概率X增加1,30%概率X减少1),然后计算n次迭代后所有可能的未来状态的概率。python库评估随机散步?
因此,例如,如果p = {0:0.5,1:0.2。 -1:0.3}且n = 2时,如果p = {0:0.5,1:0.2,则它将返回{0:0.37,1:0.2,-1:0.3,2:0.04,-2:0.09} 。 -1:0.3}且n = 1,则它将返回{0:0.5,1:0.2。 -1:0.3}
我有工作代码,如果n很低,并且p字典很小,但是当n> 500并且字典包含大约50个值需要5分钟以上计算。我猜这是因为它只在一个处理器上执行,所以我继续修改它,以便使用python的多处理模块(因为我读过多线程并不会因为GIL而提高并行计算性能)。
我的问题是,多处理没有太大的改善,现在我不确定是因为我实现了错误还是因为python中的多处理开销。我只是想知道,是否有一个图书馆评估所有随机行走的可能性的所有可能性,当n> 500时并行?如果我找不到任何东西,我的下一步是在C中编写我自己的函数作为扩展,但这将是我第一次做这件事,尽管我已经用C编写了一段时间。
原非多道编码
def random_walk_predictor(probabilities_tree, period):
ret = probabilities_tree
probabilities_leaves = ret.copy()
for x in range(period):
tmp = {}
for leaf in ret.keys():
for tree_leaf in probabilities_leaves.keys():
try:
tmp[leaf + tree_leaf] = (ret[leaf] * probabilities_leaves[tree_leaf]) + tmp[leaf + tree_leaf]
except:
tmp[leaf + tree_leaf] = ret[leaf] * probabilities_leaves[tree_leaf]
ret = tmp
return ret
多道码
from multiprocessing import Manager,Pool
from functools import partial
def probability_calculator(origin, probability, outp, reference):
for leaf in probability.keys():
try:
outp[origin + leaf] = outp[origin + leaf] + (reference[origin] * probability[leaf])
except KeyError:
outp[origin + leaf] = reference[origin] * probability[leaf]
def random_walk_predictor(probabilities_leaves, period):
probabilities_leaves = tree_developer(probabilities_leaves)
manager = Manager()
prob_leaves = manager.dict(probabilities_leaves)
ret = manager.dict({0:1})
p = Pool()
for x in range(period):
out = manager.dict()
partial_probability_calculator = partial(probability_calculator, probability = prob_leaves, outp = out, reference = ret.copy())
p.map(partial_probability_calculator, ret.keys())
ret = out
return ret.copy()
如果我的p dict有不止是0,1,-1?举例来说,在我使用的检验中的p字典数据集看起来像[这]( https://gist.githubusercontent.com/colmex/e8f0c1741f957832a1e5/raw/5167d5c15b55f39e7083c5434550765572649dbb/gistfile1.txt),因为它有大约50个不连续的值。它只是一个遍历它们并且执行A + = sp.diags(p * np.ones(m-1),q)的问题,其中p是概率,而q是值?所以像[这](https://gist.githubusercontent.com/colmex/c559e6d94f5e43efbd15/raw/970b3c5114c116e3b78d2d363d1c7185a78367f4/gistfile1.txt),有道理吗? –
我修改了它,因为我做了错误的事情,但是我刚刚测试了它的修改,[this](https://gist.githubusercontent.com/colmex/c559e6d94f5e43efbd15/raw/e59b15b200b23b8d70f9b57c41297088428d5c2f/gistfile1.txt)是修改后的代码,并且它的工作速度非常快!这真的很好,非常感谢你! 我只是好奇它为什么比我的代码快得多?因为它们实际上是在做相同的操作,将每片叶子与所有概率相乘并将结果相加。是因为字典查找速度慢吗?因为我一遍又一遍地做了很多事情呢? –
性能问题出于几个原因 - python字典是带有分期O(1)的关联容器,乍一看类似于具有O(1)查找的数组。之所以会出现这种差别,是因为在执行读取或写入操作之前,字典查找(在读取/写入插槽时发生)需要对密钥进行散列处理,这意味着它比具有直接地址的容器慢。这在任何语言中都是如此(即数据结构不是正确的选择) –