最简单的解决方案是建立一个列表:
words = list(words_generator(text))
另一种选择是使用itertools.tee
:
words, words_copy = itertools.tee(words_generator(text))
之后,您可以使用可迭代的两个副本。但是请注意,如果您首先完全迭代一个副本,那么简单地构建列表将会更快,内存效率更高。要查看内存方面的任何增益,您应该以某种方式“同时”迭代两个副本。例如:
filtered = filter_generator(words)
total = 0
for word, _ in zip(filtered, words_copy): # use itertools.izip in python2
counter[word] += 1
total += 1
total += sum(1 for _ in words_copy)
最多使用O(n-k)
内存 wheren
是文本中的单词数,是文本k
中有趣的单词数。您可以使用以下方法简化代码:
from itertools import zip_longest #izip_longest in python2
filtered = filter_generator(words)
total = 0
for word, _ in zip_longest(filtered, words_copy):
counter[word] += 1
total += 1
del counter[None]
仅使用O(1)
内存(如果生成器是常量空间)。
但是请注意,具有显式循环会减慢代码速度,因此最后,如果内存不是一个选项,构建一个list
forwords
可能是更好的解决方案。