我说的是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来包装?
发布于 2015-09-03 06:06:34
中的代码检查过吗
.../scipy/stats/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代码,也不会构建复杂的类结构。专注于一个非常具体的计算,而不是一系列的计算。
https://stackoverflow.com/questions/32361491
复制相似问题