首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何克隆Python生成器对象?

如何克隆Python生成器对象?
EN

Stack Overflow用户
提问于 2011-02-09 20:58:24
回答 4查看 27.8K关注 0票数 60

考虑以下场景:

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os

walk = os.walk('/home')

for root, dirs, files in walk:
    for pathname in dirs+files:
        print os.path.join(root, pathname)

for root, dirs, files in walk:
    for pathname in dirs+files:
        print os.path.join(root, pathname)

我知道这个例子有点多余,但是您应该考虑到我们需要多次使用相同的walk数据。我有一个基准测试场景,为了获得有用的结果,必须使用相同的walk数据。

我尝试过在第二次迭代中克隆和使用walk2 = walk,但它不起作用。问题是。我怎么复制它呢?这是可能的吗?

提前谢谢你。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-09 21:00:03

您可以使用itertools.tee()

代码语言:javascript
复制
walk, walk2 = itertools.tee(walk)

请注意,正如文档指出的那样,这可能“需要大量的额外存储”。

票数 79
EN

Stack Overflow用户

发布于 2011-02-09 21:11:04

如果您知道每次使用都要遍历整个生成器,那么通过将生成器展开为一个列表并多次使用该列表,您可能会获得最佳性能。

walk = list(os.walk('/home'))

票数 16
EN

Stack Overflow用户

发布于 2011-02-09 21:05:43

定义函数

代码语言:javascript
复制
 def walk_home():
     for r in os.walk('/home'):
         yield r

或者甚至是这个

代码语言:javascript
复制
def walk_home():
    return os.walk('/home')

两者的用法都是这样的:

代码语言:javascript
复制
for root, dirs, files in walk_home():
    for pathname in dirs+files:
        print os.path.join(root, pathname)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4945155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档