簡體   English   中英

Python 序列化 - 為什么選擇pickle?

[英]Python serialization - Why pickle?

我知道 Python 酸洗是一種以尊重對象編程的方式“存儲”Python 對象的方法 - 不同於用 txt 文件或 DB 編寫的輸出。

您是否有關於以下幾點的更多詳細信息或參考資料:

  • 腌制物品“存放”在哪里?
  • 為什么酸洗保留對象表示比存儲在數據庫中更多?
  • 我可以從一個 Python shell 會話到另一個會話檢索腌制對象嗎?
  • 當序列化有用時,你有重要的例子嗎?
  • 使用pickle 進行序列化是否意味着數據“壓縮”?

換句話說,我正在尋找關於酸洗的文檔 - Python.doc 解釋了如何實現酸洗,但似乎沒有深入了解有關序列化的使用和必要性的細節。

Pickling 是一種將 Python 對象(列表、字典等)轉換為字符流的方法。 這個想法是這個字符流包含在另一個 python 腳本中重建對象所需的所有信息。

至於腌制信息的存儲位置,通常會這樣做:

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)

這會將我們的var dict 的腌制版本存儲在 'filename' 文件中。 然后,在另一個腳本中,您可以從此文件加載到變量中,然后重新創建字典:

with open('filename','rb') as f:
    var = pickle.load(f)

酸洗的另一個用途是,如果您需要通過網絡(可能使用套接字或其他方式)傳輸此字典。首先需要將其轉換為字符流,然后才能通過套接字連接發送它。

此外,這里沒有“壓縮”可言……這只是將一種表示(在 RAM 中)轉換為另一種(在“文本”中)的方法。

About.com 在這里有一個很好的酸洗介紹。

酸洗對於分布式和並行計算是絕對必要的。

假設您想使用multiprocessing (或使用pyina跨集群節點)執行並行 map-reduce,那么您需要確保要跨並行資源映射的函數將被處理。 如果它不腌制,則不能將其發送到另一個進程、計算機等上的其他資源。另請參閱此處的一個很好的示例。

為此,我使用dill ,它可以序列化 Python 中的幾乎所有內容。 Dill 也有一些很好的工具,可以幫助您了解在代碼失敗時是什么導致酸洗失敗。

而且,是的,人們使用選擇來保存計算的狀態,或者你的ipython會話,或者其他任何東西。 如果您願意,您還可以擴展 pickle 的 Pickler 和 UnPickler 以使用bz2gzip進行壓縮。

我發現它對於大型和復雜的自定義類特別有用。 在我想到的一個特定示例中,“收集”信息(來自數據庫)以創建類已經成功了一半。 然后,用戶可能會在運行時更改存儲在類中的信息。

您可以在數據庫中擁有另一組表並編寫另一個函數來檢查存儲的所有內容並將其寫入新的數據庫表。 然后你需要編寫另一個函數來加載通過讀回所有這些信息而保存的內容。

或者,您可以按原樣腌制整個類,然后將其存儲到數據庫中的單個字段中。 然后當你去加載它時,它會像以前一樣一次性加載回來。 在保存和檢索復雜的類時,這最終會節省大量時間和代碼。

這是一種序列化。 使用 cPickle 它比泡菜快得多。

import pickle
##make Pickle File
with open('pickles/corups.pickle', 'wb') as handle:
    pickle.dump(corpus, handle)

#read pickle file
with open('pickles/corups.pickle', 'rb') as handle:
    corpus = pickle.load(handle)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM