如何克隆生成器对象?
考虑一下这个情况:
#!/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
来复制并在第二次使用,但这并没有成功。我该怎么复制它呢?这有可能吗?
6 个回答
6
定义一个函数
def walk_home():
for r in os.walk('/home'):
yield r
或者这样也可以
def walk_home():
return os.walk('/home')
这两种方式的使用方法是这样的:
for root, dirs, files in walk_home():
for pathname in dirs+files:
print os.path.join(root, pathname)
17
如果你知道每次使用的时候都要遍历整个生成器,那么把生成器转换成一个列表,可能会让你获得更好的性能。这样你就可以多次使用这个列表了。
walk = list(os.walk('/home'))
84
你可以使用 itertools.tee()
这个工具:
walk, walk2 = itertools.tee(walk)
不过要注意,文档提到这可能会“需要额外的存储空间”,也就是说可能会占用更多的内存。