Python 如何加速Poisson-pmf函数?
我的用例是在小于10的所有点上计算泊松pmf,我会多次调用这种函数,并使用差分lambdas。lambda在时间上是未知的,所以我不能矢量化lambda 我从某处听说了一个秘密窍门,那就是使用Python 如何加速Poisson-pmf函数?,python,scipy,distribution,Python,Scipy,Distribution,我的用例是在小于10的所有点上计算泊松pmf,我会多次调用这种函数,并使用差分lambdas。lambda在时间上是未知的,所以我不能矢量化lambda 我从某处听说了一个秘密窍门,那就是使用\u pmf。这样做的缺点是什么?但是,它仍然有点慢,有没有办法在不从头重写C中的pmf的情况下对其进行改进 %timeit scipy.stats.poisson.pmf(np.arange(0,10),3.3) %timeit scipy.stats.poisson._pmf(np.arange(0,1
\u pmf
。这样做的缺点是什么?但是,它仍然有点慢,有没有办法在不从头重写C中的pmf的情况下对其进行改进
%timeit scipy.stats.poisson.pmf(np.arange(0,10),3.3)
%timeit scipy.stats.poisson._pmf(np.arange(0,10),3.3)
a = np.arange(0,10)
%timeit scipy.stats.poisson._pmf(a,3.3)
10000 loops, best of 3: 94.5 µs per loop
100000 loops, best of 3: 15.2 µs per loop
100000 loops, best of 3: 13.7 µs per loop
更新
好吧,我只是太懒了,没法用cython写东西。我原以为所有离散分布都有一个更快的解决方案,可以对连续的x
进行顺序(迭代)计算。例如,P(X=3)=P(X=2)*lambda/3如果X~Pois(lambda)
相关的:
我现在对Scipy和Python不太信任了。库函数没有我预期的那么高级
大多数
scipy.stats
发行版都支持矢量化评估:
>>> poisson.pmf(1, [5, 6, 7, 8])
array([ 0.03368973, 0.01487251, 0.00638317, 0.0026837 ])
这可能不够快,也可能不够快,但您可以尝试将pmf
调用从循环中取出
关于pmf
和\u-pmf
之间的区别:真正的工作是在带下划线的函数(\u-pmf
,\u-cdf
等)中完成的,而公共函数(pmf
,cdf
)则确保只有有效的参数指向\u-pmf
(如果参数无效,\u pmf
的输出不能保证有意义,因此使用时请自行承担风险)
进一步的细节:我发现与一个简单的python实现相比,
scipy.stats.poisson
类的速度非常慢
没有cython或vectors之类的东西
导入数学
def poisson_pmf(x,mu):
返回mu**x/math.factorial(x)*math.exp(-mu)
def泊松分布函数(k,μ):
p_总计=0.0
对于范围(k+1)内的x:
p_总+=泊松pmf(x,μ)
返回p_总计
如果您检查了scipy.stats.poisson
(甚至是带下划线前缀的版本)的属性,那么很清楚为什么
上面的实现现在只比C语言(用gcc-O3
v9.3编译)慢了10倍。scipy版本至少比C语言慢了10倍
#包括
无符号长阶乘(无符号n){
无符号长事实=1;
for(无符号k=2;k
>>> poisson.pmf(1, -1)
nan
>>> poisson._pmf(1, -1)
/home/br/virtualenvs/scipy-dev/local/lib/python2.7/site-packages/scipy/stats/_discrete_distns.py:432: RuntimeWarning: invalid value encountered in log
Pk = k*log(mu)-gamln(k+1) - mu
nan