在Python内存中处理文件的最佳方法

在Python内存中处理文件的最佳方法,python,time-complexity,Python,Time Complexity,假设我有一个未定义名称为text file的目录。所以我想检查一组单词中每个单词的数量。由于这些文件的大小可能很大,我想知道用Python实现这一点的最有效方法是什么。这种经典方法看起来并不理想: for file in files: with open(file) as f: content = f.readlines() for word in words: if word in content:

假设我有一个未定义名称为text file的目录。所以我想检查一组单词中每个单词的数量。由于这些文件的大小可能很大,我想知道用Python实现这一点的最有效方法是什么。这种经典方法看起来并不理想:

for file in files:
    with open(file) as f:
        content = f.readlines()
        for word in words:
            if word in content:
                count+=1
我的问题是:

  • 我应该如何处理内存中的大文件
  • 这个问题的复杂性是O(n*m),其中n=#个文件,m=#个单词,有可能减少这个问题吗?或者是否有任何数据结构可以帮助我

  • 第一步是不要使用readlines()-它一次将整个文件的内容转储到内存中,因此除了内存复杂度外,时间复杂度为O(n*m)。您可以使用readline()来减少它,而是逐行读取它,直到EOF


    就时间而言,您正在寻找某种类型的dict-可能是collections.Counter。它允许O(1)查找已经遇到的单词。

    第一步是不使用readlines()-它一次将整个文件的内容转储到内存中,因此除了内存复杂性外,时间复杂性直接上升到O(n*m)。您可以使用readline()来减少它,而是逐行读取它,直到EOF


    就时间而言,您正在寻找某种类型的dict-可能是collections.Counter。它允许O(1)查找已经遇到的单词。

    是的,关于内存复杂性,您是对的,但是使用readline也会创建大量读取,我想使用一个可以存储不止一行的缓冲区会更好(或者readline本身可以做到这一点)。但是我并没有遵循你所说的关于时间的内容..Readlines()反复调用readline(),所以它是等价的。这有点像列表理解和生成器表达式之间的区别,最终结果是一样的,但你要么一次完成,要么零碎完成。时间记录允许你避免重复你已经计算过的单词列表,以找到与增量匹配的单词;这是一个hashmap。是的,关于内存复杂性,你是对的,但是使用readline也会创建大量的读取,我想使用一个可以存储不止一行的缓冲区会更好(或者readline本身可以做到这一点)。但是我并没有遵循你所说的关于时间的内容..Readlines()反复调用readline(),所以它是等价的。这有点像列表理解和生成器表达式之间的区别,最终结果是一样的,但你要么一次完成,要么零碎完成。时间记录允许你避免重复你已经计算过的单词列表,以找到与增量匹配的单词;这是一个hashmap。