【问题标题】:While loops vs for loop -- speedWhile 循环 vs for 循环——速度
【发布时间】:2018-11-12 13:42:09
【问题描述】:

我一直认为 for 循环比 while 循环运行得更快。但是,我最近刚刚测试了速度,无法弄清楚为什么 while 循环的运行速度要快 5 到 6 倍。这是我写的测试代码。

test1 = datetime.now()

ll = 100000
for kk in range(10000000):
   pass


print('Time for 100000 runs is ({}s)'.format(datetime.now() - test1))

test2 = datetime.now()

ll = 10000000
while ll > 0:
    ll = ll -11

print('Time for 100000 runs is ({}s)'.format(datetime.now() - test2))

运行此测试后,我发现 for 循环运行大约 1.26 秒,while 循环运行大约 0.22 秒。如果 for 循环更快,为什么我不总是以这种方式人为地将 for 循环转换为 while 循环?

谢谢!

编辑:在人们指出我的错字后,并使用@RPGillespie 的建议将范围(10000000)移出时间之前,我得到了符合我预期的结果。也就是说,for 循环比 while 循环快三倍左右。

【问题讨论】:

  • 在你的 while 循环中,你减去 11,所以你的 while 循环比你的 for 循环经历更少的迭代。
  • 您在 while 循环中从 ll 变量中减去 11。
  • 一个原因可能是您的 while 循环只运行了 for 循环迭代次数的 1/10,除非这是一个错字。
  • range(10000000) 是一个函数调用,它(取决于你的 python 版本)会生成一个巨大的列表,所以你的 while 循环不会立即处理时间损失。
  • 运行 10M 迭代并报告 100k 迭代也无济于事......

标签: python performance


【解决方案1】:

这会运行 1000000010^7 次:

for kk in range(10000000):
   pass

这会运行10000000/11909090 次,或~9*10^5

ll = 10000000
while ll > 0:
    ll = ll -11

鉴于它们不是等效的循环,因此它们以不同的速度运行也就不足为奇了。

【讨论】:

    【解决方案2】:

    我不是 python 专家,所以我无法证明 datetime.now 正在做什么(它可能是特定于系统的),但看起来你的 for 循环实际上迭代的次数比你的 while 循环多,这可以解释差异。换行:

    ll = ll -11
    

    ll = ll -1
    

    并且您应该在每个循环中进行相同数量的迭代。

    【讨论】:

      【解决方案3】:

      以下代码将您的计数器减 11,而不是 1。一定是拼写错误?

      while ll > 0:
      ll = ll -11
      

      由于您的计数器在 while 循环中递减一个更大的值,这将导致该循环比 for 循环更快地完成。

      【讨论】:

        【解决方案4】:

        第一个循环运行了 10000000 次 第二个循环运行 909091 次

        改为尝试:

        from datetime import datetime
        
        test1 = datetime.now()
        a = 0
        b = 0
        for kk in range(10000000):
           a = a + 1
        print('Time for 100000 runs is ({}s)'.format(datetime.now() - test1))
        
        test2 = datetime.now()
        
        while b < a:
            b = b + 1
        print('Time for 100000 runs is ({}s)'.format(datetime.now() - test2))
        

        这分别给了我 1.190000 和 1.061000。

        for/in 习惯用法通常会导致更快的操作。如果你关心速度,你应该看看 numpy 和 pypy。

        【讨论】:

          【解决方案5】:

          速度不同的原因在于数字的生成方式。表达式求值比函数调用更快。

          【讨论】:

            猜你喜欢
            • 2012-10-02
            • 2015-11-24
            • 1970-01-01
            • 2013-09-09
            • 2019-11-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            相关资源
            最近更新 更多