相关文章推荐
想出家的墨镜  ·  解决C/C++报错error: ...·  2 年前    · 
温柔的打火机  ·  JavaScript Promise 对象 ...·  2 年前    · 

这两天学习的过程中,遇到了OJ用例超时的问题。当时曾经怀疑过 for 和 while 的用时不同,在网上搜索,看到了一个帖子:

https://cartoonyu.github.io/cartoon-blog/post/java/for%E4%B8%8Ewhile%E6%97%B6%E9%97%B4%E7%9A%84%E5%AF%B9%E6%AF%94/

作者用 java 测试,得到的结果是 while 比 for 循环快一倍左右。于是想试试 python 是不是也一样。

统计时间用的是 timeit 模块,先给出代码:

import timeit
# 用for累加到100
def add_for():
    i = 0
    for i in range(100):
        i += 1
# 用while累加到100
def add_while():
    i = 0
    while i < 5050:
        i += 1
# 每组循环各完成1000次,重复统计10次时间
t = timeit.repeat(stmt="add_for()", setup="from __main__ import add_for", number=1000, repeat=10)
s = timeit.repeat(stmt="add_while()", setup="from __main__ import add_while", number=1000, repeat=10)
# 打印结果
print('for 循环:')
print(t)
print('while 循环:')
print(s)
print('while/for快:')
ratio = [0]*10
for i in range(10):
    ratio[i] = round(s[i] / t[i], 4)
print(ratio)

得到的结果与 java 结果完全相反:

for 循环:
[0.026281299999999952, 0.021809999999999885, 0.01696070000000005, 0.01729409999999998, 0.019016000000000144, 0.02117559999999985, 0.014239300000000066, 0.017828100000000013, 0.015251999999999821, 0.015944100000000017]
while 循环:
[1.0215057, 0.9755085000000001, 0.9660049999999996, 0.9831992999999999, 0.9114519000000003, 0.8905858000000002, 0.9209617000000003, 0.9084654000000008, 0.8850265999999998, 0.886657099999999]
while/for快:
[38.8682, 44.7276, 56.9555, 56.8517, 47.9308, 42.0572, 64.6775, 50.9569, 58.0269, 55.6104]

没想到 for 循环竟然比 while 循环快 40 - 60 倍?

如果把加法增加到1000呢?时间太长,就先试试 repeat 3 次:

import timeit
# 用for累加到1000
def add_for():
    i = 0
    for i in range(1000):
        i += 1
# 用while累加到1000
def add_while():
    i = 0
    while i < 500500:
        i += 1
# 每组循环各完成1000次,重复统计10次时间
t = timeit.repeat(stmt="add_for()", setup="from __main__ import add_for", number=1000, repeat=3)
s = timeit.repeat(stmt="add_while()", setup="from __main__ import add_while", number=1000, repeat=3)
# 打印结果
print('for 循环:')
print(t)
print('while 循环:')
print(s)
print('while/for快:')
ratio = [0]*3
for i in range(3):
    ratio[i] = round(s[i] / t[i], 4)
print(ratio)
for 循环:
[0.14319700000000002, 0.1319249, 0.14127219999999996]
while 循环:
[84.65048540000001, 84.79356329999999, 84.31703720000002]
while/for快:
[591.1471, 642.7412, 596.841]

结果 for 循环时间增加了大概7-8倍,但是while 增加了 80 多倍,可见还是 for 循环更省时间。

这两天学习的过程中,遇到了OJ用例超时的问题。当时曾经怀疑过 for 和 while 的用时不同,在网上搜索,看到了一个帖子:“https://cartoonyu.github.io/cartoon-blog/post/java/for%E4%B8%8Ewhile%E6%97%B6%E9%97%B4%E7%9A%84%E5%AF%B9%E6%AF%94/”作者用 java 测试,得到的结果... for(let i=0;i<arr.length;i++){    //5000个数据大概260毫秒 for(let j=0;j<arr.length-i;j++){ if(arr[j]>arr[j+1]){ let temp ...
众所周知, Python 不是一种执行效率较高的语言。此外在任何语言 ,循环都是一种非常消耗 时间 的操作。假如任意一种简单的单步操作耗费的 时间 为 1 个单位,将此操作重复执行上万次,最终耗费的 时间 也将增长上万倍。 while和for是 Python 常用的两种实现循环的关键字,它们的运行效率实际上是有差距的。比如下面的测试代码: import timeit def while_loop(n=100_000_000): i = 0 s = 0 while i &...
在一个群里与大家学习 python ,群里讨论起了for循环和while循环的效率问题。当时有点好奇,因为从接触编程以来就没有考虑过这个问题,所以自己亲自进行了测试,并找了一些网上的资料。但是本文主要还是娱乐向为主,可以了解但是不要纠结这个问题 微信公众号:大数据报文 在看这个问题之前,有两个前提希望大家明白 在实际编程 ,选择循环的第一点并不是他的性能,而是可读性。所以大家了解...