我期待通過StringIO
那裏說的來源說一些注意事項:爲什麼StringIO對象比實際文件對象慢?
- 使用真正的文件往往是速度更快(但不太方便)。
- C中還有一個更快的實現,名爲
cStringIO
,但它不是可以子類化的。
StringIO
就像一個內存文件對象, 爲什麼它不是真正的文件對象慢?
我期待通過StringIO
那裏說的來源說一些注意事項:爲什麼StringIO對象比實際文件對象慢?
cStringIO
,但它不是可以子類化的。StringIO
就像一個內存文件對象, 爲什麼它不是真正的文件對象慢?
Python的文件處理is implemented entirely in C。這意味着它非常快速(至少與本機C代碼的數量級相同)。
但是,StringIO庫是用Python編寫的。模塊本身因此被解釋,並伴隨着相關的性能損失。
如您所知,還有另一個模塊cStringIO,其中包含一個similar interface,您可以在性能敏感的代碼中使用該模塊。 的原因,這是不是子類化是因爲它是用C寫的
從源代碼並不是很明顯,但是python文件對象是直接構建在C庫函數上的,可能有一小部分python呈現一個python類,甚至是一個C wrapper來呈現一個python類。本地C庫將被高度優化以從磁盤讀取字節和塊。 python的StringIO庫都是原生的python代碼 - 比原生C代碼慢。
我相信OP已經找到了源代碼... – XORcist 2014-08-30 09:39:23
好的 - 重新閱讀它是矛盾的問題。一個小編輯是必需的 - 完成:-) – 2014-08-30 09:43:49
對不起我的可憐的英語,我的意思是'看穿',而不是'尋找'。 – JanuaryStar 2014-08-30 09:53:25
這是不實際上對Python的解釋性質:BytesIO
是在Python *實現相同StringIO
,但仍擊敗文件I/O 。
實際上,StringIO
比StringIO
的理想用例(一次寫入空緩衝區開始處)下的文件I/O更快。事實上,如果寫入足夠大,它甚至會打敗cStringIO
。看到我的問題here。
那麼爲什麼StringIO
被認爲是「慢」? StringIO
的真正問題得到不可變序列的支持,無論是str
還是unicode
。這很好,如果你只寫一次,顯然。但是,正如我的問題tdelaney's answer所指出的那樣,當寫入隨機位置時,它會減慢一噸(如10-100倍),因爲每次它在中間寫入時都必須複製整個支持序列。
BytesIO
沒有這個問題,因爲它支持一個(可變的)bytearray
來代替。同樣,不管cStringIO
做什麼,它似乎更容易處理隨機寫入。我猜想它在內部打破了不變性規則,因爲C字符串是可變的。
*好吧,無論如何_pyio
的版本。 io
的標準庫版本是用C編寫的。
感謝您的回答。 – JanuaryStar 2014-08-30 09:56:41