跳出for循环的坑

  • Python 语言学习成本低,写出来很像伪代码,可读性高,等等有很多显而易见的优点。相比于其他语言,Python 几乎总是最慢的。导致 Python 我们运行一个脚本的时候,无力吐槽。最恐怖的还是python中的for循环,异常的慢,但是工程中一个项目的周期是有要求的,我们如何让我们的代码跑起来呢?

少写for循环

  • 这里所得是少写,而不是不写。有的时候是避免不了的,但是能避免我们还是一定不要写。下面展示for循环和其他方法的时间的差距。
# 生成一个列表

li=[1,2,3,4,5,6,7,8,9,1]*1000
len(li)
%%timeit
# 查看for循环的时间,
li_1 = []
for i in li:
    if i==9:
        li_1.append(1)
    elif i !=9:
        li_1.append(0)

li_1

运行结果

1.99 ms ± 23.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
# 推导式实现
li_2 = [i//9 for i in li ]
li_2

运行结果

814 µs ± 15.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
# 高阶函数map
map(lambda x: x//9, li)

运行结果

457 ns ± 4.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
import numpy as np
li_array = np.array(li)
%%timeit
# numpy实现
np.where(li_array!=9,0,1)

运行结果

39.1 µs ± 2.3 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  • 我们知道ms/µs/ns之间的换算单位是1000为刻度。可以看出,for循环最慢,map函数最快,map函数是for循环的1.99*1000*1000/457=4354.5倍,numpy也跑出不错的成绩,numpy底层是C语言写的,大概是for循环的1.99*1000/39.1=50.9倍。这还是1万的数据量,在工程中动不动千万,数十亿的数据,更显的for循环的慢慢慢。所以尽量不要写for循环。

推荐阅读更多精彩内容