我正在使用 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 更准确
| 归档时间: |
|
| 查看次数: |
1513 次 |
| 最近记录: |