是否有来自scipy.stats的`norm`方法的cythonized版本?

时间:2015-09-02 19:24:05

标签: python scipy cython

我在谈论scipy.stats中连续RV的主要公共方法:

具体地, from scipy.stats import norm 然后使用

norm.ppfnorm.pdf

链接:http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html

使用cython有没有机会在norm.ppf()或norm.pdf()上进行速度优化?或者它已经优化或不值得用cython包装?

1 个答案:

答案 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进行参数检查和按摩之外,我还看到隐藏在putmaskplace中的一些迭代。我还没有使用place,但我认为它会在cond上进行迭代,并应用self._pdf,并将值放在output中。我怀疑代码组织旨在提供很多灵活性,允许不同的模型和分发。我没有看到针对速度的紧密代码。

对于可以从转换为cython而受益的代码,您可能需要从头开始编写一些东西,这些代码不会调用其他numpyscipy代码,并且不会构建精心设计的班级结构。专注于非常具体的计算,而不是一系列的计算。