【问题标题】:Speed Up Program Below下面的加速程序
【发布时间】:2020-10-19 05:18:21
【问题描述】:

我在下面编写了这个 for 循环程序,我逐个元素地遍历数组,并对这些元素进行一些数学运算。一旦计算出数学,它就会被存储到另一个数组中。

for i in range(0, 1024): 
   x[i] = a * data[i]+ b * x[(i-1)] + c * x[(i-2)]

所以在我的程序中,a、b 和 c 只是标量数。数据和 x 是数组。数据的数组大小为 1024,每个元素中都填充有数字。 X 也是一个大小为 1024 的数组,但最初用全零填充。为了计算 x 的新元素,我使用 x 的前两个元素。最初前两个是 0 和 0,因为它从 x 零数组中获取最后两个元素。我将 data 的当前元素乘以 a,将 x 的最后一个元素乘以 b,并将 x 的倒数第二个元素乘以 c。然后我将所有内容相加并将其保存到 x 的当前元素中。然后我对 data 和 x 中的每个元素做同样的事情。

这个循环程序有效,但我想知道是否有更快的方法来做到这一点?也许使用 numpy 函数的组合,如 cumsum 或点积?有人可以帮助我使程序更快吗?谢谢!

【问题讨论】:

  • 这似乎会失败 - 你得到 i=0 和 1 的负索引
  • 我认为不可能。即使使用循环,Numpy 数组也可能会更快
  • 如果您正在寻找关于工作代码的反馈/建议,那么codereview.stackexchange.com 是更合适的发布位置。
  • Numpy 是提高速度的好选择
  • 您不必担心负索引,因为我在循环之前定义了 x = np.zeros(1024)。所以 x[-1] = 0 和 x[-2] = 0 无论如何,因为在 numpy 数组中,如果你采用数组的负索引,它会向后工作。循环根本不会失败。我只想知道有没有办法不用for循环来写?

标签: python arrays numpy loops filter


【解决方案1】:

一般来说,如果您想要一个快速的程序,Python 不是最佳选择。 Python 非常适合原型设计,因为它很简单并且有很多工具,但是如果你将它与例如 C 进行比较,它的原始形式的计算效率并不高。我通常做的是使用 Cython,它是一个用于python 让您将脚本转换为机器代码(就像您使用 C 所做的那样),这将大大提高应用程序的速度。

它让你键入转换变量,例如:

cdef double a, b, c

当您在 Python 中使用变量时,必须每次检查变量以确保它是什么类型的变量(int、double、string 等)。在 C 中,这不是问题,因为您必须从一开始就决定变量应该是什么,从而减少操作的时间消耗。

【讨论】:

    【解决方案2】:

    使用递归方法可以做到的最好的事情:

    x = a * data
    coef = np.array([c,b])
    for i in range(2, 1024): 
       x[i] += np.dot(coef, x[i-2:i])
    

    但更好的是,您可以将此递归方程求解为封闭形式的解,并直接应用而无需循环。 (这是一个基本的二阶线性方程)

    【讨论】:

    【解决方案3】:

    我会尝试在列表理解中转换 for 循环,它在 python 中的处理时间要快得多。

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 2013-09-02
      • 2019-06-14
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      相关资源
      最近更新 更多