我正在實現一個需要序列化和反序列化大對象的程序,所以我正在用pickle
,cPickle
和marshal
模塊進行一些測試以選擇最佳模塊。一路上我發現了一些非常有趣的東西:元帥轉儲更快,cPickle加載速度更快
我在使用dumps
,然後loads
(對於每個模塊)列表中的字典,元組,int,float和字符串。
這是我的標杆輸出:
DUMPING a list of length 7340032
----------------------------------------------------------------------
pickle => 14.675 seconds
length of pickle serialized string: 31457430
cPickle => 2.619 seconds
length of cPickle serialized string: 31457457
marshal => 0.991 seconds
length of marshal serialized string: 117440540
LOADING a list of length: 7340032
----------------------------------------------------------------------
pickle => 13.768 seconds
(same length?) 7340032 == 7340032
cPickle => 2.038 seconds
(same length?) 7340032 == 7340032
marshal => 6.378 seconds
(same length?) 7340032 == 7340032
因此,從這些結果中我們可以看出,marshal
是在傾銷的基準部分極快:
14.8x比
pickle
快了2.6倍,比cPickle
快了2.6倍。
但是,對於我很大的驚喜,marshal
是遠遠超過cPickle
慢於裝載部分:快
2.2倍倍
pickle
,但比cPickle
慢3.1X倍。
至於RAM,marshal
性能的同時,加載是也非常低效:
我猜爲什麼加載與marshal
是如此之慢是某種與長度相關的原因的序列化字符串(遠遠長於pickle
和cPickle
)。
- 爲什麼
marshal
轉儲速度更快,加載速度更慢? - 爲什麼
marshal
序列化的字符串很長? - 爲什麼
marshal
的加載在RAM中如此低效? - 有沒有辦法改善
marshal
的加載性能? - 有沒有辦法合併
marshal
快速傾銷與cPickle
快速加載?
downvoter,小心分享? – juliomalegria
你的問題是死路一條。 'marshal'模塊並不是用來替代'pickle'的。沒有關於編組文件格式的官方文檔,它可能因版本而異,因此您的基準測試結果可能在未來是錯誤的。 –
關於速度差異:我懷疑它是關於文件IO的:文件產生的文件是近四倍(112MB vs 30MB)。 –