python 生成器 延迟加载

本文探讨了Python中使用中括号与圆括号创建列表和生成器的区别,以及这两种方式如何影响内存使用和数据库查询效率。通过实例展示了在不同场景下选择合适的数据结构的重要性。

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

进入python shell

>>> x = [1, 2, 3]

>>> y = [i*2 for i in x]

>>> y

[2, 4, 6]

>>> type(y)

<type 'list'>

这样得到的y是list类型

>>> y= (i*2 for i in x)

>>> y

<generator object <genexpr> at 0xb74ee89c>

>>> type(y)

<type 'generator'>

将中括号用圆括号去替代后,y变成生成器对象,延迟加载了,只是声明出表达式而没有做真正的运算

我们真正需要它做一些事的时候可以强制转化成真正的list

>>>  list(y)

[2, 4, 6]

这样就变成真正的list

 

同理在数据库操作的时候

如在django中操作一个model对象

question_list = Question.objects.all()

这个语句并没有执行数据库的查询,也就是说没有执行sql语句

当我们去遍历它的时候

for question in question_list:

  ...

  ...

  pass

才会真正执行sql去查询,由于我们遍历的时候可能还会进行一些处理和其他操作

所以可能会发好几条sql给数据库

这时候如果数据量不是很巨大

可以这样:

question_list = list(Question.objects.all())

强制转化成了真正的包含数据的list,sql语句只被执行一次

再进行遍历就相当于从缓存中读取数据

 

转载于:https://www.cnblogs.com/lixiaodi/p/4686100.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值