在Python中读取大型文件(52mb)的行,是否更好地迭代行或使用readlines?

时间:2015-08-28 17:26:47

标签: python file-io

我在txt文件中有一个包含4百万个单词的列表,我想将其添加到列表中。我有两个选择:

l=[line for line in open(wordlist)]

或:

wordlist = file.readlines()

readlines()似乎要快得多,我猜这是因为数据一次性读入内存。第一个选项对于节省内存会更好,因为它一次读取一行,这是真的吗? readlines()在复制时是否使用任何类型的缓冲区?一般哪种情况最好用?

3 个答案:

答案 0 :(得分:8)

这两个选项在一个大的列表中将整个内容读入内存。第一个选项较慢,因为您将循环委托给Python字节码。如果你想用文件中的所有行创建一个大的列表,那么没有理由在这里使用列表推导。

我不使用 。循环遍历文件并在循环时处理行

with open(wordlist) as fileobj:
    for line in fileobj:
        # do something with this line only.

通常不需要将整个未处理的文件数据保存在内存中。

答案 1 :(得分:1)

我认为真正的答案是,这取决于。

如果你有记忆,那么你使用多少并不重要。然后,您可以通过各种方式将所有400万个字符串放入带有readlines()方法的列表中。但后来我会问,是否真的有必要立刻将它们全部留在内存中?

可能性能更高的方法是一次迭代每个行/单词,用该单词做一些事情(count,hashvectorize等),然后让垃圾收集器将它带到转储。此方法使用一次生成一行的生成器,而不必要地将所有内容读入内存。

Python 3. *中的很多内置函数正在转向这种生成器样式one example is xrange vs range

答案 2 :(得分:0)

考虑到你在列表上进行二进制搜索,但是需要先对它进行排序。,你需要将数据读入一个列表并排序,在一个包含1000万个随机数字的文件中,调用readlines和就地.sort稍快一些:

In [15]: %%timeit
with open("test.txt") as f:
     r = f.readlines()
     r.sort()
   ....: 
1 loops, best of 3: 719 ms per loop

In [16]: %%timeit
with open("test.txt") as f:
    sorted(f)
   ....: 
1 loops, best of 3: 776 ms per loop

In [17]: %%timeit
with open("test.txt") as f:
     r = [line for line in f] 
     r.sort()
   ....: 

1 loops, best of 3: 735 ms per loop

您在列表中使用的方法与您使用的方法相同,因此没有内存优势,唯一的区别是readlines比列表comp或在文件对象上调用排序更有效。