簡體   English   中英

在Python中,read()或readlines()更快嗎?

[英]In Python, is read() , or readlines() faster?

我想在我的代碼中讀取一個巨大的文件。 read()或readline()更快。 循環怎么樣:

for line in fileHandle

對於一個文本文件,只需用for循環迭代就可以了。 沒關系速度,它是最干凈的。

在某些版本的python中, readline()確實只讀取一行,而for循環讀取大塊並將它們分成行,因此它可能更快。 我認為最近的Python版本使用緩沖也為readline()這樣的表現差異將是微不足道的( for很可能還是微觀更快,因為它避免了一個方法調用)。 然而,出於性能原因選擇一個而不是另一個可能是過早的優化。

編輯添加:我剛剛查看了一些Python發行說明。 Python 2.5說:

將迭代文件與for line in file混合並調用文件對象的read()/ readline()/ readlines()方法現在是非法的。

Python 2.6引入了TextIOBase,它同時支持iterating和readline()

Python 2.7修復了交錯read()readline()

如果文件很大,read()肯定是個壞主意,因為它將整個文件加載到內存中(沒有大小參數)。

Readline只讀取一行,所以我認為這是大文件的更好選擇。

只是迭代文件對象應該與使用readline一樣有效。

有關詳細信息,請參閱http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects

readlines的文檔表明有一個可選的sizehint。 因為它是如此模糊,很容易被忽視,但我發現這通常是讀取文件的最快方式。 使用readlines(1),它提示一行,但實際上讀取大約4k或8k的行IIRC。 這利用了OS緩沖並在不使用過多內存的情況下減少了調用次數。

您可以嘗試使用不同大小的sizehint,但我在測試時發現1在我的平台上是最佳的

read()基本上是嘗試讀取整個文件並將其保存到單個字符串中以便稍后使用,而readlines()也嘗試讀取整個文件但它會進行拆分(“\\ n”)並存儲字符串將行放入列表中。 因此,如果文件大小過大,則不優選這兩種方法。

readline()和for循環(即文件中的行:)將一次讀取一行並將其存儲到字符串中。 如果內存允許,我猜他們會用同一時間完成這項工作。 但是,如果文件大小很大,則首選這兩個。

如果你有足夠的內存使用readline,如果性能是一個問題。 我已經看到了使用gzip文件時: read().split('\\n')需要5秒才能循環,而使用迭代器需要38秒。 GZ文件的大小約為45 MB。

read()和readlines()之間的真正區別read函數只是將文件原樣加載到內存中。 readlines方法將文件讀取為沒有行終止的行列表。 readlines方法只應用於文本文件,並且不應在大文件上使用。 如果從文本文件中復制信息,則讀取效果很好,因為可以使用寫入功能輸出,而無需添加行終止。

如果您的文件是文本文件,那么使用readlines(),這顯然是讀取包含行的文件的方式。 除此之外:如果您真的意識到可能的性能問題,請執行基准測試。 我懷疑你會遇到任何問題....文件系統的速度應該是限制因素。

都不是。 他們倆都會將內容讀入內存。 對於大文件,迭代文件對象一次只加載一行文件,這可能是處理大文件內容的好方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM