加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

加速Python中的双循环

发布时间:2020-12-20 13:35:59 所属栏目:Python 来源:网络整理
导读:有没有办法加快从上一次迭代更新其值的双循环? 在代码中: def calc(N,m): x = 1.0 y = 2.0 container = np.zeros((N,2)) for i in range(N): for j in range(m): x=np.random.gamma(3,1.0/(y*y+4)) y=np.random.normal(1.0/(x+1),1.0/sqrt(x+1)) container
有没有办法加快从上一次迭代更新其值的双循环?

在代码中:

def calc(N,m):
    x = 1.0
    y = 2.0
    container = np.zeros((N,2))
    for i in range(N):
      for j in range(m):
        x=np.random.gamma(3,1.0/(y*y+4))
        y=np.random.normal(1.0/(x+1),1.0/sqrt(x+1))
      container[i,0] = x
      container[i,1] = y
    return container

calc(10,5)

如您所见,内部循环更新变量x和y,而外部循环每次以不同的x值开始.我不认为这是可矢量化的,但也许还有其他可能的改进.

谢谢!

解决方法

我不认为这会增加任何重要的加速,但如果你一次生成所有的伽玛和正态分布的随机值,你可以保存一些函数调用.

Gamma函数具有scaling property,因此如果从gamma(k,1)分布中绘制值x,则c * x将是从gamma(k,c)分布中绘制的值.类似地,使用正态分布,您可以获取从法线(0,1)分布中绘制的y值,并将其转换为从执行x * s m的法线(m,s)分布中绘制的值.所以你可以按如下方式重写你的函数:

def calc(N,2))
    nm = N*m
    gamma_vals = np.random.gamma(3,1,size=(nm,))
    norm_vals = np.random.normal(0,))
    for i in xrange(N):
        for j in xrange(m):
            ij = i*j
            x = gamma_vals[ij] / (y*y+4)
            y = norm_vals[ij]/np.sqrt(x+1) + 1/(x+1)
        container[i,0] = x
        container[i,1] = y
    return container

如果你的发行版的实际参数有一个更简单的表达式,你实际上可以使用一些精心设计的np.cumprod等形式,并为自己节省循环.我无法弄清楚这样做的方法……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读