【问题标题】:Python, Random vector vs Random number in an for loopPython,for循环中的随机向量与随机数
【发布时间】:2017-02-02 22:47:56
【问题描述】:

我正在尝试用高斯噪声解决一些随机微分方程。我想知道使用 Noise Vector 是否更好:

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])

使用 fg 表现良好的函数,或者我是否应该在每次迭代中创建 随机数

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 思维方式

【问题讨论】:

  • 是什么让您说 for 循环不是最接近 Python 思维方式? For 循环完全符合 Python 风格。
  • 如果你使用python2,你应该使用xrange而不是rangerange(N)会创建一个N数字列表...)
  • 嗯,使用 numpy 最好避免 for 循环
  • 我会选择第一个,想法是在循环中做最少的工作。不过,我可能会改变您添加新元素的方式 - 可能会查看已初始化的数组。
  • 如果问题可以描述为数值积分,那么有专用的 numpy、scipy 函数可能比运行自己的反向差分循环更好、更快

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


【解决方案1】:

一般来说,您的问题没有明确的答复,并假设“ok”的性能就足够了。实际上,我会在这里考虑三种这样的策略。

  1. 在开始时生成所有随机值。优点:减少循环期间的调用开销。缺点:需要大量内存。
  2. 使用外循环和内循环,您可以在其中仅为内循环的迭代次数生成随机值。
  3. 在内循环中完成所有工作。优点:需要更少的内存。缺点:最大调用开销。

方法“2”的一个有趣优势是,您可以使用 Cython(例如)加速内循环,而无需更改随机数生成器。

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

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

【讨论】:

  • 感谢您的回答,我将采取解决方案2。我尝试为您的答案投票,但作为新用户,这是不可能的。
  • 好的,谢谢你告诉我。 (是否尝试过“接受”答案?)
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 2012-05-20
  • 2013-10-28
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
相关资源
最近更新 更多