如何克隆生成器对象?

63 投票
6 回答
31826 浏览
提问于 2025-04-16 11:30

考虑一下这个情况:

#!/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)

不过要注意,文档提到这可能会“需要额外的存储空间”,也就是说可能会占用更多的内存。

撰写回答