python 生成器 延迟加载

进入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语句只被执行一次

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

 

posted @ 2015-07-29 15:40  lixiaodi  阅读(310)  评论(0编辑  收藏  举报