【问题标题】:Speeding up nested loops in python加速python中的嵌套循环
【发布时间】:2016-10-12 20:30:27
【问题描述】:

如何在 python 中加快这段代码的速度?

while ( norm_corr > corr_len ): 

    correlation = 0.0

    for i in xrange(6):
        for j in xrange(6):
            correlation += (p[i] * T_n[j][i]) * ((F[j] - Fbar) * (F[i] - Fbar))      

    Integral += correlation
    T_n =np.mat(T_n) * np.mat(TT)
    T_n = T_n.tolist()
    norm_corr = correlation / variance 

这里,TT是固定的6x6矩阵,p是固定的1x6矩阵,F是固定的1x6矩阵。 T_n 是 TT 的 n 次方。

这个 while 循环可能会重复 10^4 次。

【问题讨论】:

  • 您是否有理由希望 T_n 成为列表列表而不是 numpy 矩阵?
  • 您能否提供一些关于 TT、p、F 和 T_n 的示例数据。这将是一个易于测试的工作示例(当然,我们可以创建自己的随机矩阵,但另一种方式是您的代码将是复制和粘贴可执行文件(如果您还包括导入......)。
  • 您可能还想在Code Review上提问
  • 您是否尝试过运行分析器来查看代码的哪一部分速度较慢? docs.python.org/3/library/profile.html
  • 大约一半的计算时间被嵌套循环消耗,另一半被矩阵乘法消耗。

标签: python performance loops


【解决方案1】:

快速完成这些事情的方法是使用 Numpy 的内置函数和运算符来执行操作。 Numpy 使用优化的 C 代码在内部实现,如果您正确设置计算,它将运行得更快。

但有效地利用 Numpy 有时会很棘手。它被称为“向量化”你的代码——你必须弄清楚如何以一种作用于整个数组的方式来表达它,而不是使用显式循环。

例如,在您的循环中,您有 p[i] * T_n[j][i],恕我直言,这可以通过向量矩阵乘法来完成:如果 v 是 1x6,m 是 6x6,那么 v.dot(m) 是 1x6,计算 v 的点积与m 的列。如有必要,您可以使用转置和重塑来处理不同的维度。

【讨论】:

  • 感谢您的建议。为了用一行代码替换嵌套循环,我尝试了两种不同的方法:列表推导和 numpy.einsum。但是,嵌套循环比这两种方法都快。
猜你喜欢
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多