我一直认为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循环快约三倍。答案 0 :(得分:5)
这会运行10000000
或10^7
次:
for kk in range(10000000):
pass
这会运行10000000/11
或909090
次,或~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)
速度差异的原因是数字生成的方式。表达式评估比函数调用更快。