Performance python中计算卡方CDF的速度(比scipy更快)

Performance python中计算卡方CDF的速度(比scipy更快),performance,python-2.7,numpy,scipy,Performance,Python 2.7,Numpy,Scipy,我有五个大的标准正态分布向量len=125000000,堆积在一个叫做vec的[5125000000]numpy数组中。我接着做: chisqr = sum(multiply(vec,vec)/var_vec,0) 然后使用scipy获取CDF并执行以下操作: one_minus_cdf = 1-stats.chi2.cdf(chisqr,[5]) 除了这最后一行需要花费大量的时间来完成外,它工作得很好。有人能帮我想出一个办法让这更快吗?先谢谢你 我对python不是很有经验,所以请容忍我。

我有五个大的标准正态分布向量len=125000000,堆积在一个叫做vec的[5125000000]numpy数组中。我接着做:

chisqr = sum(multiply(vec,vec)/var_vec,0)
然后使用scipy获取CDF并执行以下操作:

one_minus_cdf = 1-stats.chi2.cdf(chisqr,[5])
除了这最后一行需要花费大量的时间来完成外,它工作得很好。有人能帮我想出一个办法让这更快吗?先谢谢你

我对python不是很有经验,所以请容忍我。我使用非官方的windows二进制文件安装了numpy和scipy是的,对不起;我在窗户上。我认为默认情况下numpy是根据ATLAS编译的?如果我下载了MKL,我不知道如何使用它。我知道我可以得到30天的试用期。我只是想知道,在开始使用像MKL这样的东西之前,我是否还有其他的建议或技巧,顺便问一下,从这个开始,最软的方法是什么

以下是一个可复制的示例:

import numpy as np
from scipy import stats

vec = np.random.rand(5,12500000)

var_mad = np.tile(np.mat(1).T,(1,12500000))    
chisqr = sum(np.multiply(vec,vec)/var_mad,0)
one_minus_cdf = 1-stats.chi2.cdf(chisqr,[5])

什么是var_vec?求和和和乘法从何而来?努比?一个复制/可复制的示例不需要所有的1.25亿行,这将非常有用。最后一个问题:您是如何安装numpy/scipy的?它们是否使用BLAS/ATLAS/MKL/etc进行了优化?什么是大量时间?机器正在交换吗?最后你要做大量的计算,所以需要一段时间。chisq cdf是不完整的gamma函数,因此可以直接使用scipy.special.gammainc。在我的机器上,这只提供了大约10%的加速。你认为一减cdf能保持什么,你想用它做什么?你有5个大向量的正常样本。你规范化它们,将它们平方并相加,所以你的结果应该以5个自由度的卡方分布。对cdf进行125e6调用会很慢,但您可以通过对卡方样本进行排序并调用它们的np.cumsum来估计cdf……您不可能比Scipy计算cdf快得多。该调用直接进入一个用C编写的例程,该例程计算不完整的gamma函数,所有时间都花在那里。MKL等人没有帮助,他们没有不完整的伽马函数。为矢量化浮点运算或更好的incbeta近似优化C例程可能是可行的,但这说起来容易做起来难,而且似乎不太可能有大的加速。@CraigJCopi stats.chi2.cdf对输入是否有效进行了大量检查,需要创建中间数组,并检查参数的广播。如果您确定只有有效值,那么stats.chi2.\u cdf可以避免这种开销。