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

本文对比了Python中列表推导与生成器表达式的性能差异,通过实验表明在时间和空间效率上生成器表达式更胜一筹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

列表推导生成器表达式都是用来创建可迭代对象的工具,但它们在实现使用上有一些区别。 列表推导是一种创建列表的方法,它允许使用一种简洁的语法来生成一个新的列表列表推导会立即生成并返回一个完整的列表对象。例如,你可以使用列表推导来将一个列表中的每个元素进行平方运算: ``` numbers = [1, 2, 3, 4, 5] squared_numbers = [x**2 for x in numbers] ``` 在这个例子中,`[x**2 for x in numbers]` 是一个列表推导式,它将 `numbers` 列表中的每个元素进行平方运算,并生成一个新的列表 `squared_numbers`。 生成器表达式也是一种创建可迭代对象的方法,但它返回的是一个生成器对象。生成器表达式使用圆括号而不是方括号,并且它不会立即生成完整的列表,而是按需逐个生成元素。这种延迟计算的特性使得生成器表达式在处理大量数据时更高效。例如,你可以使用生成器表达式来计算一个序列中所有数的平方: ``` numbers = [1, 2, 3, 4, 5] squared_sum = sum(x**2 for x in numbers) ``` 在这个例子中,`(x**2 for x in numbers)` 是一个生成器表达式,它会逐个生成 `numbers` 列表中的每个元素的平方,并传递给 `sum()` 函数进行求。 总结来说,列表推导生成一个完整的列表对象,适用于需要一次性处理所有元素的情况;而生成器表达式返回一个生成器对象,适用于需要逐个处理元素或处理大量数据的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值