暴力实验
环境:py3.7.2,pyCharm内运行同时开了百度云、浏览器qq等其他应用程序
此次实验的意义在于让我们对python暴力的速度心里有个谱。
探究循环内print对程序执行速度的影响
i = 0
while True:
i += 1
print(i)
一分钟之后打印到了:15234500
如果改成这样
def main():
i = 0
while True:
i += 1
if i % 100 == 0:
print(i)
return None
一分钟之后打印到了:588877600,速度是上一个的38倍
继续降低打印频率
def main():
i = 0
while True:
i += 1
if i % 10000 == 0:
print(i)
return None
一分钟之后到了:761820000,速度是每一步都打印的50倍,总体提升的幅度减小了
再继续降低打印频率
def main():
i = 0
while True:
i += 1
if i % 1000000 == 0:
print(i)
return None
一分钟之后到了:824000000,速度是第一次实验的54倍,速度提升效果已经不明显了。
一分钟可以遍历800…00(8后8个零) 这么多次
结论:
如果每一步都打印,会拖慢50倍左右
for循环比while循环快吗
def main():
for i in range(1000000000000):
print(i)
return None
一分钟之后遍历到了:14596281,相比while循环,居然还慢了5%
列表推导式更快吗
def timer(func):
def newFunc():
t1 = time()
func()
print(time() - t1)
return newFunc
@timer
def main():
arr = []
for i in range(500000):
arr.append(i ** 2)
return None
0.17652654647827148
@timer
def main():
arr = [i ** 2 for i in range(500000)]
return None
0.15957307815551758
只快了一点点 0.02秒,扩大数据量发现也依然只是快0.02秒
空for循环测试
@timer
def main():
for i in range(800000000):
pass
return None
13.081990480422974秒
14.064324378967285
如果里面添加一个判断语句
@timer
def main():
for i in range(800000000):
if i % 2 == 0:
pass
pass
return None
37.41891169548035,速度变慢了2.6倍
如果改成两个pass,是不是两个pass都会执行
@timer
def main():
for i in range(800000000):
pass
pass
return None
13.391043901443481秒,似乎不会
经过测试发现即使加了20个pass也还是13秒左右
如果把pass改成点点点
@timer
def main():
for i in range(800000000):
...
return None
13.304449796676636,依然如此
多加了20行的点点点,还是13.175700902938843,13秒左右,貌似点点点还比pass更快。
其他语句比较速度
@timer
def main():
for i in range(800000000):
arr = []
return None
26.918959379196167
@timer
def main():
for i in range(800000000):
a = 1
return None
15.657132625579834
声明一个变量的速度要快于声明list的速度
@timer
def main():
a = 0
for i in range(800000000):
a += 1
return None
33.9800968170166
如果是累加就又慢了
|