2014-06-18 41 views
3

我注意到用pickle加載5000個對象的字典需要很長時間(分鐘) - 但加載5000個實體的文件的json需要很短的時間(秒)。我知道一般情況下,對象會帶來一些開銷 - 而在OOP中,與跟蹤這些對象相關的開銷是輕鬆使用它們的一部分成本。但爲什麼裝載一個醃製物體需要很長時間。引擎蓋下發生了什麼?序列化對象的相關成本與僅將其數據寫入文件相比,是多少?酸洗是否會將對象恢復到內存中的相同位置? (也許將其他物體移開)。如果序列化加載速度較慢(至少是醃菜),那麼優點是什麼?爲什麼加載一個pickle對象比加載文件花費的時間要長得多?

+1

您正在使用的cPickle與二進制協議? –

+0

@gnibbler不,我不是 – bernie2436

+2

您需要發佈示例代碼來顯示您實際上正在比較的內容以及如何計時。如果沒有它,你會要求我們猜測你是如何進行比較的,以及你正在使用的pickle和JSON解串器的實現。 –

回答

3

假設您正在使用Python 2.7標準picklejson模塊...

所以你基本上是比較純的Python解串器的優化的C解串器。即使序列化格式相同,也不是一個公平的比較。

+0

我和OP有同樣的問題,比較一行一行地加載一個文本文件(分成小對象,每行一個)和加載對象列表的pickle。我使用cPickle,二進制格式和最高協議,並且unpickling比閱讀和重建慢50%。 –

1

有比較特定對象的序列化速度比較,比較JSON和pickle和cPickle。每個對象的速度在每種格式中都會有所不同。 JSON通常比鹹菜速度快,而且你經常聽說不使用鹹菜,因爲它不安全。安全問題和一些速度滯後的原因是,pickle實際上並沒有序列化非常多的數據,而是序列化一些數據和一堆指令,其中指令用於彙編python對象。如果你曾經看過dis模塊,你會看到pickle爲每個對象使用的指令類型。 cPickle和json一樣,不是純python,並且利用優化的C,所以它通常更快。

酸洗應占用較少的空間,一般來說比存儲一個對象本身 - 然而,一般來說,一些指令集可能相當大。 JSON往往更小......並且是人類可讀的......但是,由於json將所有東西都存儲爲可讀的字符串......它不能像pickle和cPickle那樣序列化許多不同類型的對象。因此,權衡是json的「安全性」(或靈活性,取決於您的視角),而hunan可讀性與pickle可以序列化更廣泛的對象。

選擇pickle(通過json)的另一個好的理由是你可以很容易地擴展pickle,這意味着你可以註冊一個新方法來序列化一個pickle不知道如何pickle的對象。 Python提供了幾種方法來做到這一點...... __getstate____setstate__以及copy_reg方法。使用這些方法,你會發現人們已經延長了pickle來序列化大部分python對象,例如dill

酸洗不會將對象恢復到同一內存位置。但是,它會將對象重新組裝到與醃製時相同的狀態(通常)。如果你想看到一些原因,人味酸,看看這裏:

Python serialization - Why pickle?

http://nbviewer.ipython.org/gist/minrk/5241793

http://matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/

相關問題