繁体   English   中英

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

[英]Reading large file (52mb) of lines in Python, is it better to iterate the lines or use readlines?

我有一个txt文件中有400万个单词的列表,我想添加到列表中。 我有两个选择:

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

要么:

wordlist = file.readlines()

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

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

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

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

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

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

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

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

Python 3. *中的许多内置函数正在转向这种生成器样式, 一个例子是xrange vs range

考虑到您正在列表上进行二进制搜索,但需要先对其进行排序。 ,你需要将数据读入一个列表并排序,在一个有1000万随机数字的文件上,调用readlines和一个inplace .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或调用文件对象调用更有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM