python yield理解

来源:互联网 发布:北师珠网络教学综合 编辑:程序博客网 时间:2024/05/17 22:09

yield 应该是让那个对象在被遍历的时候才动态执行的,例子来源自http://blog.csdn.net/questionfish/article/details/46739207中的一个部分,如下:


需要注意的是,上面的语料库整个作为一个Python List存在了内存中。在这个简单的例子中,这当然无关紧要。但是我们因该清楚,假设我们有一个百万数量级文档的语料库,我们不可能将整个语料库全部存入内存。假设这些文档存在一个硬盘上的文件中,每行一篇文档。Gemsim仅要求一个语料库可以每次返回一个文档向量:
[python] view plain copy
  1. >>> class MyCorpus(object):  
  2. >>>     def __iter__(self):  
  3. >>>         for line in open('mycorpus.txt'):  
  4. >>>             # assume there's one document per line, tokens separated by whitespace  
  5. >>>             yield dictionary.doc2bow(line.lower().split())  
请在这里下载示例文件mycorpus.txt。
这里假设的在一个单独的文件中每个文档占一行不是十分重要;你可以改造 __iter__ 函数来适应你的输入格式,无论你的输入格式是什么样的,例如遍历文件夹、解析XML、访问网络等等。你仅需在每个文档中解析出一个由记号(tokens)组成的干净列表,然后利用dictionary将这些符号转换为其id,最后在__iter__函数中产生一个稀疏向量即可。
[python] view plain copy
  1. >>> corpus_memory_friendly = MyCorpus() # 没有将整个语料库载入内存  
  2. >>> print(corpus_memory_friendly)  
  3. <__main__.MyCorpus object at 0x10d5690>  
现在的语料库是一个对象。我们没有定义任何打印它的方法,所以仅能打印该对象在内存中的地址,对我们没什么帮助。为了查看向量的组成,让我们通过迭代的方式取出语料库中的每个文档向量(一次一个)并打印:
[python] view plain copy
  1. >>> for vector in corpus_memory_friendly: # 一次读入内存一个向量  
  2. ...     print(vector)  
  3. [(01), (11), (21)]  
  4. [(01), (31), (41), (51), (61), (71)]  
  5. [(21), (51), (71), (81)]  
  6. [(11), (52), (81)]  
  7. [(31), (61), (71)]  
  8. [(91)]  
  9. [(91), (101)]  
  10. [(91), (101), (111)]  
  11. [(41), (101), (111)]  
虽然输出与普通的Python List一样,但是现在的语料库对内存更加友好,因为一次最多只有一个向量寄存于内存中。你的语料库现在可以想多大就多大啦!


更深刻的理解参考:彻底理解Python中的yield

原创粉丝点击