Python:生成器表达式与列表推导式

Python生成器表达式与列表推导式


生成器

有点类似于列表推导式但并不生成列表对象。生成器是仅当被需要时才产生下一项,而不是像列表推导式一样,生成整个列表并存在内存中。一个有返回的正常函数被调用时,当调用方得到返回时调用结束。但有yield声明的函数保存了函数状态并且能在下一次函数被调用时,以相同状态被唤醒。生成器表达式允许我们无需yield即可创建生成器。

#传统的列表创建方式
list1 = []
for i in range(100):
    if i % 3 == 0:
        a.append(i)
print(a)

#列表推导式
list1 = [i for i in range(10) if i % 3 == 0]

#生成器表达式创建
generator1 = (i for i in range(100) if i % 3 == 0)


列表推导式和生成器表达式外观(语法)上的主要区别在于列表推导式用方括号,生成器表达式用圆括号。打印生成器表达式的创建结果,是该对象的存储地址。如果想打印生成器表达式的输出,可以遍历该生成器对象:

for i in generator1:
    print(i, end = "") 

列表推导式和生成器表达式的区别:

1、内存使用效率:
如下所示,生成器仅在需要时(被调用时)一次产生一项结果存入内存,然而在列表推导式中,Python为整个列表保留内存。可以说,生成器表达式相比于列表在内存使用效率上更高。

from sys import getsizeof                                               

a = [i for i in range(99999)]                                           
b = (i for i in range(99999))                                           
x = getsizeof(a)                                                        
y = getsizeof(b)                                                        

print(x)                                                                
824464

print(y)                                                                
88

2、时间效率:
如下所示,在执行时间上,列表推导式和生成器表达式在执行时间上也有很明显的差别,因此,生成器表达式比列表推导式更快,更节约时间。

import timeit

# 列表推导式
print(timeit.timeit('''list_com = [i for i in range(100) if i % 3 == 0]''',number = 10000000) 
# 生成器表达式
print(timeit.timeit('''gen_exp = (i for i in range(100) if i % 3 == 0)''',number = 10000000) 

# 列表推导式输出:
4.669294930994511
#生成器表达式输出:
0.4217875720351003
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z-xina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值