gpt4 book ai didi

python - 加快 Python 中 beta Pert 分布的计算

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:26 24 4
gpt4 key购买 nike

我正在为 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

最佳答案

这里是一些修改过的代码:

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)

Rp_max = max
e1_96 = 1.96 * e
e0_75 = 0.75 * e
for i in xrange(nlocs): # e.g 153413
for mu_d_j in mu_d: # mu_d has 121 values
Rp_min = mu_d_j - e1_96
Rp_mode = mu_d_j - e0_75
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)

解释如下:

保存循环内的每条指令

  • Rp_max = max 移出循环
  • 在循环外预先计算常量(对于 e1_96e0_75)

避免更深层次的引用

  • 只做一次 mu_d[j] 并为此使用局部变量,获取更深的值需要时间

使用 for 循环代替 lst[i]

获取值

以下:

for j in xrange(len(mu_d)): # mu_d has 121 values
mu_d_j = mu_d[j]

应该变得更高效(和 Pythonic):

for mu_d_j in mu_d: # mu_d has 121 values
#now use mu_d_j

测量时间

这是基本规则,每次修改都应进行评估。如果您设置了预期速度(处理时间),您就有可能很快停止优化够了。

免责声明

由于我无法运行代码,我无法保证所有更改都是正确的。即有几行,我不确定,他们将做什么:

最后一行 dist =

   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)

是否正确缩进?现在,它为每个 nloc 循环执行一次。

生成的 dist 值在哪里使用?

如果它是最深循环的一部分,那么可以做更多的优化(使用更少的变量名称移动一些内联代码)。

关于python - 加快 Python 中 beta Pert 分布的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24822436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com