列表推导和生成器表达式性能对比

  • 列表推导(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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值