- 列表推导(list comprehension)可用于生成列表(list)
- 生成器表达式(generator expression)可以用来创建其它任何类型的序列。
list在很多场景下被滥用,事实上生成器表达式的性能在很多情况下要优于列表推导。生成器表达式是逐个地生产元素,而不是事先建立一个完整的列表,然后再逐个取出列表元素。
测试代码如下:
from time import perf_counter as pc
@profile
def listcomps_genexps_compare():
a = range(1000)
b = range(1000)
time1 = pc()
genexps = ((i, j) for i in a for j in b)
time2 = pc()
print(time2 - time1)
listcomps = [(i, j) for i in a for j in b]
print(pc() - time2)
if __name__ == '__main__':
listcomps_genexps_compare()
在命令行中执行代码:
λ python -m memory_profiler .\test.py
0.0001756160531318386
51.757552345557656
Filename: .\test.py
Line # Mem usage Increment Line Contents
================================================
4 42.941 MiB 42.941 MiB @profile
5 def listcomps_genexps_compare():
6 42.941 MiB 0.000 MiB a = range(1000)
7 42.941 MiB 0.000 MiB b = range(1000)
8 42.941 MiB 0.000 MiB time1 = pc()
9 44.973 MiB -92.133 MiB genexps = ((i, j) for i in a for j in b)
10 42.941 MiB 0.000 MiB time2 = pc()
11 43.184 MiB 0.242 MiB print(time2 - time1)
12 137.102 MiB -1035.211 MiB listcomps = [(i, j) for i in a for j in b]
13 137.105 MiB 0.004 MiB print(pc() - time2)
可以看到,genexps不管是时间效率还是空间效率都远远高于listcomps。