为什么scipy.stats.norm.ppf实现如此之慢?

时间:2018-01-31 21:59:06

标签: python scipy

我使用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更准确

0 个答案:

没有答案