我在txt文件中有一个包含4百万个单词的列表,我想将其添加到列表中。我有两个选择:
l=[line for line in open(wordlist)]
或:
wordlist = file.readlines()
readlines()似乎要快得多,我猜这是因为数据一次性读入内存。第一个选项对于节省内存会更好,因为它一次读取一行,这是真的吗? readlines()在复制时是否使用任何类型的缓冲区?一般哪种情况最好用?
答案 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或在文件对象上调用排序更有效。