我在谈论scipy.stats中连续RV的主要公共方法:
具体地,
from scipy.stats import norm
然后使用
norm.ppf
或norm.pdf
链接:http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html
使用cython有没有机会在norm.ppf()或norm.pdf()上进行速度优化?或者它已经优化或不值得用cython包装?
答案 0 :(得分:0)
您是否检查了
中的代码... / SciPy的/统计/ distributions.py?
看起来norm_pdf
最终使用
_norm_pdf_C = math.sqrt(2*pi)
_norm_pdf_logC = math.log(_norm_pdf_C)
def _norm_pdf(x):
return exp(-x**2/2.0) / _norm_pdf_C
由于它不涉及通过numpy数组的循环,因此它看起来不像cython
加速的主要候选者。你会用不同的方式写出来吗?
def pdf(self,x,*args,**kwds):
args, loc, scale = self._parse_args(*args, **kwds)
x,loc,scale = map(asarray,(x,loc,scale))
args = tuple(map(asarray,args))
x = asarray((x-loc)*1.0/scale)
cond0 = self._argcheck(*args) & (scale > 0)
cond1 = (scale > 0) & (x >= self.a) & (x <= self.b)
cond = cond0 & cond1
output = zeros(shape(cond),'d')
putmask(output,(1-cond0)+np.isnan(x),self.badvalue)
if any(cond):
goodargs = argsreduce(cond, *((x,)+args+(scale,)))
scale, goodargs = goodargs[-1], goodargs[:-1]
place(output,cond,self._pdf(*goodargs) / scale)
if output.ndim == 0:
return output[()]
return output
除了使用map
进行参数检查和按摩之外,我还看到隐藏在putmask
和place
中的一些迭代。我还没有使用place
,但我认为它会在cond
上进行迭代,并应用self._pdf
,并将值放在output
中。我怀疑代码组织旨在提供很多灵活性,允许不同的模型和分发。我没有看到针对速度的紧密代码。
对于可以从转换为cython
而受益的代码,您可能需要从头开始编写一些东西,这些代码不会调用其他numpy
和scipy
代码,并且不会构建精心设计的班级结构。专注于非常具体的计算,而不是一系列的计算。