为什么 scipy.stats.norm.ppf 实现这么慢?

asd*_*sdf 5 python scipy

我正在使用 scipy 版本 0.19.0。我看到在 scipy\stats_continuous_distns 下,函数_norm_ppf包装了scipy.special.ndtri. 我的问题是,这使用什么实现以及为什么这么慢?

为了进行比较,我在 ASA 241 中创建了一个众所周知的逆 cdf 开源实现的 ac 扩展(“R8_NORMAL_01_CDF_INVERSE”)。您可以通过以下链接查看它的一个版本:http://people.sc.fsu.edu/~jburkardt/c_src/asa241/asa241.html

一些简单的基准测试显示 scipy 的版本几乎慢了 1000 倍:

import timeit
from scipy.stats import norm
from QSCoreExtensions import r8_normal_01_cdf_inverse # compiled extension

def a():
    norm.ppf(.3456)

def b():
    r8_normal_01_cdf_inverse(.3456)

print(timeit.timeit('a()', number=10000, globals=globals()))
print(timeit.timeit('b()', number=10000, globals=globals()))
Run Code Online (Sandbox Code Playgroud)

输出:

1.219758156838038

0.0021004953395136194

请注意,任何输入(不仅仅是 0.3456)都会产生类似的结果。另外,r8_normal_01_cdf_inverse 精度是 10**16 的 1 分之一,实际上比 scipy.stats.norm.ppf 更准确