【问题标题】:Python nested loop speed issuesPython嵌套循环速度问题
【发布时间】:2016-06-02 21:01:52
【问题描述】:

我目前正在开发一个程序来测试理想的角度值来构建某些东西。现在我被困在一个嵌套循环中,我将附在下面。虽然理想情况下它将每个 'a' 计数为 9000,但如果值设置如下,则几乎需要永远。有没有办法加快这个嵌套循环?或者我可以以某种方式为 python 分配更多资源吗?

for a1 in  xrange(15, 91):
    for a2 in xrange(15, 91):
        for a3 in xrange(15, 91):
            for a4 in xrange(15, 91):
                for a5 in xrange(15, 91):
                    for ite in xrange(1, 1000):
                        ok = mathmatvec(a1, a2, a3, a4, a5, ite) 
                        if ok == 1:
                                v[0] = a1
                                v[1] = a2
                                .
                                .

【问题讨论】:

  • 您确定需要检查所有76 * 76 * 76 * 76 * 76 * 999 = 2532989850624 = 2.5 万亿 个组合吗?即使要执行的操作什么都不是(将语句体的最后一个替换为“pass”),它仍然需要“几乎永远”。
  • mathmatvec() 是做什么的?该函数的时间复杂度?
  • 它计算多个向量和矩阵乘法。如果只单独使用一次,它不会花费很多时间。有关更多详细信息,请参阅我对 Rory Daulton 的回复
  • 让它成为一个函数,并在它之前添加@numba.jit
  • 如果您寻找高维度的参数,您可能希望使用随机搜索甚至是损失标准的最小化

标签: python for-loop


【解决方案1】:

itertools.product() 函数将大大加快嵌套的 for 循环。

也就是说,运行时间很可能取决于对 mathmatvec() 的调用总数。

【讨论】:

    【解决方案2】:

    您可以尝试将 for 循环转换为 while 循环,因为后者不会创建任何迭代器,所以应该更快。所以而不是:

    for a1 in xrange(15, 91):
    

    写:

    a1 = 15
    while a1 < 91:
        ...
        a1 += 1
    

    或者尝试使用PyPy

    【讨论】:

      【解决方案3】:

      解决方案:使用不同的算法。

      现在,您执行最内层循环 999*(76**5) == 2,532,989,850,624 次。这可能太多了,除非最里面的循环计算是微不足道的。

      你说你想“测试理想的角度值来构建一些东西”。如果您可以形式化“理想”的含义,您可以使用优化算法将您想要的内容归零。如果您向我们提供有关您正在搜索的内容的更多详细信息,我们可能会告诉您更好的 Python 例程或算法。


      如果我理解正确,mathmatvec() 只取值 0 和 1,并且您想为 15 &lt;= a1 &lt;= 90 等找到 a1,a2,a3,a4 的值,为 1 &lt;= ite &lt;= 999 找到 ite 的值,这使得 mathmatvec(a1, a2, a3, a4, ite) 等于1 并且ite 尽可能小。

      您可以使用该函数将其变成一个多维最小化问题

      def func(a1, a2, a3, a4, ite):
          return ite - 1000 * mathmatvec(a1, a2, a3, a4, ite)
      

      然后func()mathmatvec() == 0返回一个正数,为mathmatvec() == 1返回一个负数,当ite最小化时,负值最小化。

      根据您的函数mathmatvec() 的“平滑”程度、连接程度及其适应度,scipy.optimize 中的最小化例程之一可能会很好地解决您的问题。 scipy.optimize.differential_evolution() function 看起来特别有趣。

      【讨论】:

      • 虽然我不能将 mathmatvec 中的公式简化为琐碎的术语,但它会测试可以达到哪些 5 个角度的最小 ite(ite 值在公式中为 *0.0001)所以我的猜测是如果可以找到 ite 的最小有效(函数结果)值,请检查每个可能的角度组合(范围 15 到 90 度)。
      • 我不明白你所说的“ite”是什么意思。但是,您是否正在寻找变量 a1、a2、a3、a4、a5、ite 的值,它们为您提供函数 mathmatvec() 的最小“有效”结果?如果是这样,返回什么样的值以及范围是多少?什么是“无效”函数结果?现在听起来你想要一个多维最小化器:更多细节将确认或否认。
      • a1-5ite 是一个大公式的一部分,它必须产生一定范围内的值。如果是,则结果为“有效”,我返回 1,否则返回 0。但是,我需要的最终结果是任何 a1-5 星座的最小 ite。因此,只要满足所有条件并且 ite 小于迄今为止任何星座的结果,我都会保存所有当前值。
      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 2021-05-17
      • 2021-11-07
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多