在蒙特卡罗模拟中优化For循环

时间:2017-10-29 17:41:29

标签: montecarlo

我正在使用Nataf变换进行相关多变量模拟。我开发了一个Python(中级知识)代码来执行蒙特卡罗模拟,但它在我的计算机上花了很多时间。任何人都可以帮助我优化这些线:

# Exponential distribution (stats package)
loc_exp = 15.0
scale_exp = 139.21617 

# Gamma distribution (l-moments package)
loc_gam = 0.72698
scale_gam = 16.18526

for i in range(len(rho_z)):

# Generate standarn normal variates
    n = int(1e6)
    r = np.random.normal(0, 1, [n,2])
    ui = r[:,0]
    uj = r[:,1]
    xi = stats.expon.ppf(stats.norm.cdf(ui), loc_exp, scale_exp)
    xj = lmoments.quagam(stats.norm.cdf(rho_z[i]*ui + np.sqrt(1.0 - rho_z[i]**2)*uj), para = np.array((loc_gam, scale_gam)))
# evaluate rho_x
R = np.corrcoef(xi,xj)
rho_x[i] = R[0,1]

我正在使用stats和lmoments包。感谢

1 个答案:

答案 0 :(得分:0)

我认为矢量化不是问题所在。 如果您有一台具有多个内核的计算机,我将通过并行运行该环来使用该功能。大多数蒙特卡罗代码可以表达为令人尴尬的并行问题,例如你的问题。您可以使用例如此处描述的joblib包:https://blog.dominodatalab.com/simple-parallelization/

另外,请检查最后两行的缩进。我认为他们应该属于循环。