循环vs循环 - 速度

时间:2015-02-04 22:16:20

标签: python performance

我一直认为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秒内运行。为什么我不会总是以这种方式人为地将循环转换为while循环,如果它们更快?

谢谢!

编辑:当人们指出我的拼写错误,并使用建议@RPGillespie将时间范围(10000000)移出时间前面时,我得到的结果与我的预期相符。也就是说,for循环比while循环快约三倍。

5 个答案:

答案 0 :(得分:5)

这会运行1000000010^7次:

for kk in range(10000000):
   pass

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

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

鉴于它们不是等效的循环,它并不出乎意料地以不同的速度运行。

答案 1 :(得分:1)

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

ll = ll -11

ll = ll -1

你应该在每个循环中有相同数量的迭代。

答案 2 :(得分:1)

以下代码将您的计数器减少11而不是1.它必须是拼写错误?

while ll > 0:
ll = ll -11

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

答案 3 :(得分:1)

第一个循环运行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.190000s和1.061000s。

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

答案 4 :(得分:-1)

速度差异的原因是数字生成的方式。表达式评估比函数调用更快。