2014-08-30 32 views
4

我期待通過StringIO那裏說的來源說一些注意事項:爲什麼StringIO對象比實際文件對象慢?

  1. 使用真正的文件往往是速度更快(但不太方便)
  2. C中還有一個更快的實現,名爲cStringIO,但它不是可以子類化的。

StringIO就像一個內存文件對象, 爲什麼它不是真正的文件對象慢?

回答

1

Python的文件處理is implemented entirely in C。這意味着它非常快速(至少與本機C代碼的數量級相同)。

但是,StringIO庫是用Python編寫的。模塊本身因此被解釋,並伴隨着相關的性能損失。

如您所知,還有另一個模塊cStringIO,其中包含一個similar interface,您可以在性能敏感的代碼中使用該模塊。 的原因,這是不是子類化是因爲它是用C寫的

+0

感謝您的回答。 – JanuaryStar 2014-08-30 09:56:41

0

從源代碼並不是很明顯,但是python文件對象是直接構建在C庫函數上的,可能有一小部分python呈現一個python類,甚至是一個C wrapper來呈現一個python類。本地C庫將被高度優化以從磁盤讀取字節和塊。 python的StringIO庫都是原生的python代碼 - 比原生C代碼慢。

+0

我相信OP已經找到了源代碼... – XORcist 2014-08-30 09:39:23

+0

好的 - 重新閱讀它是矛盾的問題。一個小編輯是必需的 - 完成:-) – 2014-08-30 09:43:49

+0

對不起我的可憐的英語,我的意思是'看穿',而不是'尋找'。 – JanuaryStar 2014-08-30 09:53:25

0

這是實際上對Python的解釋性質:BytesIO是在Python *實現相同StringIO,但仍擊敗文件I/O 。

實際上,StringIOStringIO的理想用例(一次寫入空緩衝區開始處)下的文件I/O更快。事實上,如果寫入足夠大,它甚至會打敗cStringIO。看到我的問題here

那麼爲什麼StringIO被認爲是「慢」? StringIO的真正問題得到不可變序列的支持,無論是str還是unicode。這很好,如果你只寫一次,顯然。但是,正如我的問題tdelaney's answer所指出的那樣,當寫入隨機位置時,它會減慢一噸(如10-100倍),因爲每次它在中間寫入時都必須複製整個支持序列。

BytesIO沒有這個問題,因爲它支持一個(可變的)bytearray來代替。同樣,不管cStringIO做什麼,它似乎更容易處理隨機寫入。我猜想它在內部打破了不變性規則,因爲C字符串是可變的。

*好吧,無論如何_pyio的版本。 io的標準庫版本是用C編寫的。

相關問題