[英]Lightweight pickle for basic types in python?
我要做的就是對字符串或整數的元組進行序列化和反序列化。
我查看了pickle.dumps(),但字節開銷很大。 基本上看起來它占用的空間大約是所需空間的4倍。 此外,我需要的只是基本類型,不需要序列化對象。
元帥在空間方面要好一些,但結果充滿了討厭的\\ x00字節。 理想情況下,我希望結果是人類可讀的。
我想到了只使用repr()和eval(),但是有沒有一種簡單的方法可以在不使用eval()的情況下完成此任務?
這將存儲在數據庫中,而不是文件中。 字節開銷很重要,因為它可能使需要TEXT列與varchar有所不同,並且通常數據緊湊性會影響db性能的所有方面。
看一看json ,至少生成的dumps
可以用許多其他語言讀取。
JSON(JavaScript對象表示法) http://json.org是JavaScript語法(ECMA-262第三版)的子集,用作輕量級數據交換格式。
我個人將使用yaml 。 它在編碼大小上與json相當,但是在必要時它可以表示一些更復雜的東西(例如,類,遞歸結構)。
In [1]: import yaml
In [2]: x = [1, 2, 3, 'pants']
In [3]: print(yaml.dump(x))
[1, 2, 3, pants]
In [4]: y = yaml.load('[1, 2, 3, pants]')
In [5]: y
Out[5]: [1, 2, 3, 'pants']
也許您沒有使用正確的協議:
>>> import pickle
>>> a = range(1, 100)
>>> len(pickle.dumps(a))
492
>>> len(pickle.dumps(a, pickle.HIGHEST_PROTOCOL))
206
請參閱文檔以獲取泡菜數據格式 。
python文檔中提到了一些持久性內建函數,但我認為在生成的文件大小中,這些內建函數中的任何一個都不顯着。
您可以一直使用configparser,但是在那里您只能得到string,int,float,bool。
“字節開銷很大”
為什么這么重要? 它完成了工作。 如果您的磁盤空間不足,我很高興以500美元的價格向您出售1Tb。
你跑了嗎? 性能有問題嗎? 你能證明系列化的表現是什么問題?
“我想過只使用repr()和eval(),但是有沒有一種簡單的方法可以不用eval()來實現這一目標呢?”
沒有比repr和eval更簡單的了。
評估有什么問題?
是“有人可以將惡意代碼插入序列化列表的文件中”問題嗎?
誰(特別是)要查找和編輯此文件以放入惡意代碼的人? 您為保護此安全所做的任何事情(即加密)都會從中刪除“簡單”的內容。
幸運的是,有一種使用COMPRESSION的解決方案,可以解決涉及任何任意Python對象(包括新類)的一般問題。 有時,最好使用DRY工具,而不是僅對元組進行微管理。
您的代碼將更加清晰,並在類似的未來情況下易於重構。
y_serial.py模塊::使用SQLite倉庫Python對象
“序列化+持久性::在幾行代碼中,將Python對象壓縮並注釋為SQLite;然后稍后按關鍵字順序按順序檢索它們,而無需任何SQL。數據庫最有用的”標准”模塊用於存儲較少模式的數據。”
http://yserial.sourceforge.net
[如果您仍然擔心,為什么不將這些元組粘貼在字典中,然后將y_serial應用於字典。 zlib可能會在后台透明壓縮,因此任何開銷可能都會消失。]
關於可讀性,該文檔還提供了有關為什么選擇cPickle而不是json的詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.