我使用scipy版本0.19.0。我看到在scipy \ stats_continuous_distns下,函数_norm_ppf
包裹scipy.special.ndtri
。我的问题是,这使用了什么实现,为什么这么慢?
为了比较, 我在ASA 241中创建了一个众所周知的反向cdf开源实现的扩展(" 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()))
输出:
1.219758156838038
0.0021004953395136194
请注意,任何输入(不仅仅是.3456)都会产生类似的结果。此外,r8_normal_01_cdf_inverse精度是10 ** 16中的1个部分,实际上比scipy.stats.norm.ppf更准确