gpt4 book ai didi

python - 在 Python 中加速双循环

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:04 32 4
gpt4 key购买 nike

有没有一种方法可以加快从上一次迭代更新其值的双循环?

在代码中:

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 值和正态分布的随机值,您可以节省一些函数调用。

Gamma 函数有一个 scaling property , 所以如果你从 gamma(k, 1) 分布中提取一个值 x,那么 c*x 将是从 gamma(k, c) 中提取的值分配。类似地,对于正态分布,您可以从正态 (0, 1) 分布中提取 y 值并将其转换为从正态 (m, s) 分布中提取的值,执行 x*s + m。所以你可以重写你的函数如下:

def calc(N, m):
x = 1.0
y = 2.0
container = np.zeros((N, 2))
nm = N*m
gamma_vals = np.random.gamma(3, 1, size=(nm,))
norm_vals = np.random.normal(0, 1, size=(nm,))
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 或类似的形式,并避免循环。我无法想出这样做的方法......

关于python - 在 Python 中加速双循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17737175/

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