概述
Python中的列表推倒式(List Comprehension) 和 生成器表达式(Generator Expression)是两种很相似的表达式,但含义却不大不同,这里做一个对比。
列表推导式
列表推导式是比较常用的技术,能将本来需要for loop 和 if else 语句的情况简化成一条指令,最终得到一个列表对象:
even = [e for e in range(10) if e % 2 == 0]
具体细节不过多展开,相信很多使用Python的人都已经足够了解这种语法了。
需要注意的一点是,列表推导式不是惰性计算 ( Lazy Loading) 的,因此所有的列表成员都在声明完语句后立即计算 (Eager Loading),因此在数组成员很多的情况下,速度会很慢,例如下面的在IPython环境里面的三个列表推导式的耗时统计:
In [1]: %timeit even = [e for e in range(100000) if e % 2 == 0]
5.5 ms ± 24.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [2]: %timeit even = [e for e in range(1000000) if e % 2 == 0]
58.9 ms ± 440 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [3]: %timeit even = [e for e in range(100000000) if e % 2 == 0]
5.65 s ± 26.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
可以看到随着元素个数的增加,列表推导式执行的时间也相应变长,占用的内存也会变大。
有一种情况是,我们定义了很多很多的数组元素,但是最后并不是所有的元素都能用到,例如经过几条命令,最后可