在读取大型文件并通过word进行解析时,如何利用Python生成器?

在读取大型文件并通过word进行解析时,如何利用Python生成器?,python,generator,Python,Generator,这是我的相关代码。它使用生成器从文件中获取单词。但是,在输入函数之前,这些单词首先存储到变量中。这是正确的吗 这是否利用了生成器的功能 def do_something(words): new_list = {} for word in words: // do stuff to each word // then add to new_list return new_list def generate_words(input_file)

这是我的相关代码。它使用生成器从文件中获取单词。但是,在输入函数之前,这些单词首先存储到变量中。这是正确的吗

这是否利用了生成器的功能

def do_something(words):
    new_list = {}
    for word in words:
        // do stuff to each word
        // then add to new_list
    return new_list

def generate_words(input_file):
    for line in input_file:
        for word in line.split(' '):
            // do stuff to word
            yield word

if __name__ == '__main__':
    with open("in.txt") as input_file:
        words = generate_words(input_file)
        do_something(words)

谢谢

当您制作
words=generate\u words(input\u file)
时,您只是给它一个新创建的生成器的引用。当您运行
dou_something
时,即生成器实际迭代时,
words
只是对它的引用。所以答案是肯定的,你是在利用生成器。

当你制作
words=generate\u words(input\u file)
时,你只是给它一个新创建的生成器的引用。当您运行
dou_something
时,即生成器实际迭代时,
words
只是对它的引用。因此答案是肯定的,您正在利用生成器。

代码看起来不错。存储在
words
中的是一个新的生成器,准备在
generate_words
中运行代码;仅当触发word in words:的
时,代码才会实际运行。如果你想知道更多,它有一大堆信息。

代码看起来不错。存储在
words
中的是一个新的生成器,准备在
generate_words
中运行代码;仅当触发word in words:
时,代码才会实际运行。如果您想了解更多信息,它有一大堆信息。

在给定示例中使用生成器没有任何好处。 主要目的是减少内存使用

在守则中:

for line in input_file:
已从文件中读取并消耗内存。然后
split
操作创建新列表并再次消耗内存

所以,您所要做的就是遍历列表项


而生成器的使用将导致创建生成器对象,从而从现有列表中生成对象。它是完全无用的。

在给定的示例中使用生成器没有任何好处。 主要目的是减少内存使用

在守则中:

for line in input_file:
已从文件中读取并消耗内存。然后
split
操作创建新列表并再次消耗内存

所以,您所要做的就是遍历列表项


而生成器的使用将导致创建生成器对象,从而从现有列表中生成对象。它完全没有用。

@jamlak我在想,由于do_something必须等待words变量“生成”,因此它比在do_something()中将单词添加到列表中要慢,因为它们是生成的。这有意义吗?我遗漏了什么吗?那不是单子,是字典
do_something
不必等待words变量的生成,它在函数中一次生成一个。@jamlak我想既然do_something必须等待words变量的“生成”,它比在do_something()中将单词添加到列表中要慢,因为它们是生成的。这有意义吗?我遗漏了什么吗?那不是单子,是字典
do_something
不必等待words变量生成,它在函数中一次生成一个。谢谢,这正是我想知道的。谢谢,这正是我想知道的。你似乎不同意所有其他海报。你能进一步解释吗?我不同意。逐行加载文件比将整个文件加载到内存中所用的内存要少得多(除非整个文件是一行)。关键是我们正在逐行读取每个
文件。。。我同意
对于line.split(“”):yield word
需要将
line.split
中的列表加载到内存中,但在处理单个行时,这是一个非常快速的操作,因为该列表很小<代码>收益率
从该列表中提取并不是一项成本高昂的操作,您不能因此而避开生成器。想象一下将文件中的每一行加载到内存中。。。然后在没有生成器的情况下对其执行操作,这对于大型文件来说将是非常低效和缓慢的。谢谢评论。我知道这一点,但我想多讨论一下。你似乎不同意所有其他的海报。你能进一步解释吗?我不同意。逐行加载文件比将整个文件加载到内存中所用的内存要少得多(除非整个文件是一行)。关键是我们正在逐行读取每个
文件。。。我同意
对于line.split(“”):yield word
需要将
line.split
中的列表加载到内存中,但在处理单个行时,这是一个非常快速的操作,因为该列表很小<代码>收益率
从该列表中提取并不是一项成本高昂的操作,您不能因此而避开生成器。想象一下将文件中的每一行加载到内存中。。。然后在没有生成器的情况下对其执行操作,这对于大型文件来说将是非常低效和缓慢的。谢谢评论。我知道这件事,但想多讨论一下