【发布时间】:2014-07-18 21:29:51
【问题描述】:
我正在为 for 循环的每次迭代计算 beta PERT 分布(除其他事项外,但分布的计算是最耗时的)。 最初是在 R 中编写的,但这样做花费了太长时间,因此尝试使用更快的工具。
我的一些数据集可能非常大,例如我刚刚运行了一个包含 153413 个案例的案例,但在 Python 中仍然需要大约 8 小时(比 R 更好,但仍然有点长)。
我对 Python 还很陌生,想知道是否有任何方法可以加快这样的计算速度?
示例代码:
af = lambda pmu, pmin, pmode, pmax: (pmu-pmin)*(2*pmode-pmin-pmax)/((pmode-pmu)*(pmax-pmin))
bf = lambda pmu, pmin, pmode, pmax: (pmax-pmu)/(pmu-pmin)*((pmu-pmin)*(2*pmode-pmin-pmax)/((pmode-pmu)*(pmax-pmin)))
e=5.
shape=4.
max=10.
mu_d = np.arange(0, 10, 0.05)
d = np.arange(0.025, 60.025, 0.05)
nlocs=153413 # number of rows in dataset
f0_dist = np.zeros(len(mu_d))
f1_dist = np.zeros(len(mu_d))
f2_dist = np.zeros(len(mu_d))
f0 = st.norm.cdf(d, 0.9/2., 0.9/6.)
f1 = st.uniform.cdf(d, 0.001, 0.9)
tic = time.clock()
for i in xrange(nlocs):
for j in xrange(len(mu_d)): # mu_d has 121 values
Rp_min = mu_d[j] - 1.96*e
Rp_mode = mu_d[j] - 0.75*e
Rp_max = max
Rp_mu=(Rp_min+Rp_max+shape*Rp_mode)/(shape+2)
dist = st.beta.cdf(d, a=af(Rp_mu, Rp_min, Rp_mode, Rp_max), b=bf(Rp_mu, Rp_min, Rp_mode, Rp_max), loc=Rp_min, scale=1-Rp_min)
f0_dist[j] = 1 - np.sum(dist*f0*0.05)
f1_dist[j] = 1- np.sum(dist*f1*0.05)
f2_dist[j] = 1 - np.sum(dist*0.05)
temp = 0.4*f0_dist + 0.5*f1_dist + 0.1*f1_dist
aggr_dist = aggr_dist + temp
toc = time.clock() - tic
print '\nTime elapsed: %.3f seconds\n' % toc
【问题讨论】:
-
检查代码的缩进,现在有些代码在循环范围之外看得太远了,它们可能属于。
-
@JanVlcinsky 你能告诉我 st.beta 是从哪里来的吗??
-
@CodeLover 没有想法。你得问问 Neodyme。由于它不是完全运行的代码,我只是评论了优化的一般概念。
-
@CodeLover 'import scipy.stats as st'
-
@Neodyme 测试版呢??
标签: python distribution