在Python内存中处理文件的最佳方法
假设我有一个未定义名称为text file的目录。所以我想检查一组单词中每个单词的数量。由于这些文件的大小可能很大,我想知道用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:
for file in files:
with open(file) as f:
content = f.readlines()
for word in words:
if word in content:
count+=1
我的问题是:
第一步是不要使用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。