Python,随机向量vs for循环中的随机数

时间:2017-02-02 22:47:57

标签: python python-2.7 numpy for-loop random

我试图用高斯噪声来解决一些随机微分方程。我想知道是否更好地使用噪音矢量

eta = np.random.normal(size=N)*sqrtdt
q = []
p = []
q.append(1.0)
p.append(1.0)
for i in range(N):
    q.append(f(q[i],p[i],eta[i])
    p.append(g(q[i],p[i],eta[i])

f g 表现良好的函数,或者我应该在每次迭代中创建随机数

q = []
p = []
q.append(1.0)
p.append(1.0)
for i in range(N):
    eta = np.random.normal()*sqrtdt
    q.append(f(q[i],p[i],eta)
    p.append(g(q[i],p[i],eta)

此代码应放入另一个 for 循环,并运行多个 N 值,其值从10 ^ 4到10 ^ 9不等。我也愿意采用另一种方式来写这个,我知道 for 循环不是最接近 Python思维

1 个答案:

答案 0 :(得分:0)

一般来说,对你的问题没有明确的答复,假设" ok"表现就够了。实际上我会在这里考虑三种这样的策略。

  1. 在开始时生成所有随机值。 Pro:减少循环期间的调用开销。骗局:需要大量内存。
  2. 使用外部和内部循环,您可以在其中生成内部循环迭代次数的随机值。
  3. 在内循环中完成所有工作。亲:需要更少的记忆。 Con:最大呼叫开销。
  4. 方法的有趣优势" 2"是你可以用Cython加速内循环(例如)而不改变随机数发生器。

    您可以存储qp的当前值,以避免从列表中获取它们。您可以通过q.append(q_loop)p.append(p_loop)附加。

    无论如何,如果表现是一个问题,你应该对差异策略进行基准测试,并在第二次考虑使用"加速" (即Cython,Numba等)。随机方程的时间分辨率不能很好地矢量化,因此NumPy策略不适用于你。

相关问题