簡體   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