最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Python使用pickle模塊序列化數(shù)據(jù)優(yōu)化代碼的方法

 更新時間:2023年07月05日 11:13:17   作者:小斌哥ge  
這篇文章主要介紹了淺談Python使用pickle模塊序列化數(shù)據(jù)優(yōu)化代碼的方法,pickle模塊可以對多種Python對象進行序列化和反序列化,序列化稱為pickling,反序列化稱為unpickling,需要的朋友可以參考下

pickle模塊序列化數(shù)據(jù)

pickle是Python標準庫中的一個二進制序列化和反序列化庫。

可以以二進制的形式將數(shù)據(jù)持久化保存到磁盤文件中??梢詫?shù)據(jù)和代碼分離,提高代碼可讀性和優(yōu)雅度。

一、pickle模塊介紹

pickle模塊可以對多種Python對象進行序列化和反序列化,序列化稱為pickling,反序列化稱為unpickling。

序列化是將Python對象轉化為二進制數(shù)據(jù),可以配合文件操作將序列化結果保存到文件中(也可以配合數(shù)據(jù)庫操作保存到數(shù)據(jù)庫中)。

反序列化則是將二進制數(shù)據(jù)還原回Python對象,先從文件中(或數(shù)據(jù)庫中)讀取出保存的二進制數(shù)據(jù)。

pickle模塊常用的方法如下:

  • dump(obj, file): 將Python對象序列化,并將序列化結果寫入到打開的文件中。
  • load(file): 從打開的文件中讀取出保存的數(shù)據(jù),將數(shù)據(jù)反序列化成Python對象。
  • dumps(obj): 將Python對象序列化,并直接返回序列化的二進制數(shù)據(jù)(類型為bytes),而不寫入文件。
  • loads(data): 將字節(jié)碼數(shù)據(jù)反序列化成Python對象,傳入的數(shù)據(jù)必須為二進制數(shù)據(jù)(bytes-like object)。

dump()和load()是互逆的方法,dumps()和loads()是互逆的方法,使用哪一對方法取決于是否要讀寫文件。

二、pickle可以序列化哪些Python對象

pickle與json相比,json數(shù)據(jù)有嚴格的格式要求,只能保存滿足格式要求的數(shù)據(jù),而pickle幾乎可以序列化Python中的所有數(shù)據(jù)對象。

pickle可以序列化的Python對象如下:

  • None、TrueFalse
  • 整數(shù)、浮點數(shù)、復數(shù)
  • str、byte、bytearray
  • 只包含可序列化對象的集合,包括tuple、list、set和dict
  • 定義在模塊最外層的函數(shù)(使用def定義,lambda函數(shù)不可以)
  • 定義在模塊最外層的內置函數(shù)
  • 定義在模塊最外層的類
  • 某些類實例

三、案例分享

之前寫過一篇使用matplotlib繪制柱狀圖的文章,參考:使用Python的matplotlib庫繪制柱狀圖

文章里有一個56行的字典,本文利用pickle模塊來將字典序列化寫入文件中,繪圖時從文件中讀取數(shù)據(jù)并反序列化,實現(xiàn)數(shù)據(jù)與代碼的分離。

1. 將數(shù)據(jù)序列化保存

創(chuàng)建一個Python腳本pickling.py,先將56行的字典序列化保存。

# coding=utf-8
import pickle
data = {
    "DWG-DRX1": [[(3, 2, 4), (2, 0, 4), (1, 0, 1), (3, 1, 4), (0, 0, 4)],
                 [(2, 3, 1), (0, 2, 1), (1, 0, 0), (0, 2, 1), (0, 2, 2)]],
    "DWG-DRX2": [[(1, 2, 8), (6, 1, 5), (2, 1, 8), (3, 1, 7), (0, 2, 7)],
                 [(3, 3, 1), (0, 2, 5), (1, 3, 4), (2, 2, 4), (1, 2, 4)]],
    "DWG-DRX3": [[(2, 2, 10), (7, 0, 6), (5, 0, 8), (3, 1, 6), (4, 4, 4)],
                 [(3, 4, 0), (2, 6, 2), (1, 3, 0), (1, 3, 3), (0, 5, 3)]],
    "SN-JDG1": [[(4, 2, 9), (3, 1, 9), (5, 1, 11), (7, 3, 10), (1, 6, 7)],
                [(3, 5, 8), (1, 5, 7), (2, 5, 7), (7, 2, 6), (0, 3, 10)]],
    "SN-JDG2": [[(7, 2, 12), (7, 2, 14), (2, 0, 16), (9, 0, 12), (1, 4, 13)],
                [(2, 6, 2), (2, 6, 4), (0, 4, 7), (4, 4, 1), (0, 6, 7)]],
    "SN-JDG3": [[(5, 1, 5), (5, 1, 9), (3, 1, 8), (3, 1, 7), (1, 3, 11)],
                [(0, 4, 2), (1, 2, 4), (0, 4, 3), (3, 1, 4), (3, 6, 3)]],
    "SN-JDG4": [[(2, 2, 4), (3, 2, 5), (1, 0, 10), (7, 1, 5), (0, 2, 12)],
                [(2, 3, 1), (2, 3, 3), (1, 3, 4), (0, 2, 6), (2, 2, 3)]],
    "TES-FNC1": [[(2, 3, 8), (4, 2, 6), (2, 0, 8), (6, 0, 8), (1, 0, 10)],
                 [(0, 3, 3), (1, 3, 3), (4, 0, 0), (0, 6, 2), (0, 3, 3)]],
    "TES-FNC2": [[(0, 2, 10), (8, 1, 4), (4, 0, 6), (4, 1, 5), (1, 2, 13)],
                 [(3, 2, 3), (1, 4, 5), (1, 2, 3), (0, 2, 6), (1, 7, 1)]],
    "TES-FNC3": [[(3, 1, 4), (3, 1, 9), (3, 1, 7), (7, 1, 2), (0, 2, 12)],
                 [(0, 4, 3), (2, 6, 4), (2, 3, 2), (2, 0, 4), (0, 3, 3)]],
    "TES-FNC4": [[(1, 2, 7), (10, 1, 7), (6, 2, 5), (0, 4, 16), (1, 4, 12)],
                 [(2, 3, 3), (3, 1, 5), (1, 4, 8), (4, 3, 5), (3, 7, 5)]],
    "TES-FNC5": [[(1, 2, 1), (4, 1, 6), (4, 0, 6), (4, 1, 5), (0, 1, 6)],
                 [(2, 2, 1), (2, 3, 1), (0, 4, 1), (0, 1, 2), (0, 3, 2)]],
    "G2-GEN1": [[(4, 0, 7), (2, 2, 11), (4, 1, 11), (6, 1, 6), (3, 0, 10)],
                [(0, 5, 2), (3, 4, 1), (1, 3, 2), (0, 4, 1), (0, 3, 2)]],
    "G2-GEN2": [[(3, 3, 14), (4, 3, 12), (11, 0, 11), (9, 2, 13), (1, 3, 15)],
                [(3, 8, 1), (2, 5, 3), (2, 6, 5), (4, 4, 2), (0, 5, 7)]],
    "G2-GEN3": [[(2, 5, 11), (7, 2, 10), (6, 3, 13), (7, 3, 11), (1, 1, 18)],
                [(4, 5, 8), (2, 6, 7), (5, 4, 6), (3, 2, 6), (0, 6, 7)]],
    "DWG-G21": [[(4, 0, 12), (7, 2, 9), (4, 2, 11), (6, 0, 9), (1, 2, 8)],
                [(1, 5, 1), (3, 5, 2), (2, 5, 3), (0, 2, 3), (0, 5, 4)]],
    "DWG-G22": [[(4, 2, 7), (5, 1, 9), (6, 2, 11), (7, 3, 9), (3, 1, 11)],
                [(0, 7, 1), (0, 4, 4), (4, 4, 2), (3, 4, 1), (1, 6, 2)]],
    "DWG-G23": [[(3, 1, 9), (6, 2, 5), (5, 2, 6), (8, 2, 7), (0, 3, 13)],
                [(1, 3, 3), (3, 3, 4), (1, 4, 3), (2, 3, 3), (3, 9, 4)]],
    "DWG-G24": [[(5, 0, 3), (2, 0, 7), (2, 0, 10), (2, 1, 3), (4, 1, 4)],
                [(0, 5, 1), (1, 3, 0), (0, 3, 1), (1, 2, 1), (0, 2, 1)]],
    "SN-TES1": [[(5, 1, 5), (3, 1, 6), (1, 0, 4), (2, 3, 3), (0, 2, 3)],
                [(2, 4, 0), (0, 1, 4), (1, 2, 2), (4, 2, 0), (0, 2, 4)]],
    "SN-TES2": [[(5, 1, 4), (1, 2, 5), (3, 1, 7), (3, 3, 4), (0, 0, 7)],
                [(2, 1, 2), (1, 3, 5), (2, 5, 4), (2, 2, 0), (0, 1, 5)]],
    "SN-TES3": [[(3, 0, 7), (2, 2, 4), (2, 1, 4), (5, 2, 4), (1, 2, 7)],
                [(0, 3, 3), (2, 3, 3), (3, 1, 1), (0, 4, 4), (2, 2, 2)]],
    "SN-TES4": [[(5, 2, 4), (1, 3, 16), (8, 1, 8), (6, 4, 9), (1, 8, 13)],
                [(1, 2, 10), (9, 5, 4), (1, 4, 9), (5, 6, 10), (2, 4, 12)]],
    "DWG-SN1": [[(2, 2, 11), (5, 3, 9), (8, 1, 11), (4, 2, 12), (2, 4, 7)],
                [(1, 5, 5), (5, 4, 4), (3, 3, 2), (2, 3, 3), (1, 6, 3)]],
    "DWG-SN2": [[(10, 1, 4), (2, 1, 10), (3, 3, 11), (3, 3, 10), (2, 4, 7)],
                [(0, 4, 8), (5, 4, 2), (5, 6, 2), (2, 3, 5), (0, 3, 9)]],
    "DWG-SN3": [[(3, 3, 10), (5, 2, 8), (3, 3, 3), (5, 1, 6), (0, 2, 8)],
                [(3, 6, 5), (1, 2, 2), (4, 3, 2), (2, 3, 3), (1, 2, 6)]],
    "DWG-SN4": [[(2, 0, 12), (8, 0, 7), (1, 3, 5), (9, 1, 5), (4, 3, 4)],
                [(2, 9, 1), (1, 5, 2), (2, 2, 0), (2, 4, 2), (0, 4, 3)]],
}
with open('S10.pkl', 'wb') as pkl_file:
    pickle.dump(data, pkl_file)

序列化只需要兩行代碼,打開一個文件對象,使用dump()方法將字典序列化保存到了S10.pkl文件中,文件默認在代碼的同級目錄下,也可以指定絕對路徑。注意,打開文件對象時使用wb模式。

S10.pkl的后綴名可以自定義(后綴名不會改變文件保存的格式),不過因為是用pickle模塊序列化的數(shù)據(jù),通常都以.pkl作為后綴,方便識別。

直接用IDE打開文件S10.pkl,顯示的內容是亂碼的,因為保存的內容是二進制數(shù)據(jù)。

2. 讀取數(shù)據(jù)并反序列化

# coding=utf-8
import matplotlib.pyplot as plt
from matplotlib import ticker
from numpy import mean
import pickle
with open('S10.pkl', 'rb') as pkl_file:
    data = pickle.load(pkl_file)
location = ["上單", "打野", "中單", "下路", "輔助"]
win_loc_kill, win_loc_die, win_loc_assists = [[list() for _ in range(5)] for _ in range(3)]
lose_loc_kill, lose_loc_die, lose_loc_assists = [[list() for _ in range(5)] for _ in range(3)]
for i in range(5):
    win_loc_kill[i] = [value[0][i][0] for value in data.values()]
    win_loc_die[i] = [value[0][i][1] for value in data.values()]
    win_loc_assists[i] = [value[0][i][2] for value in data.values()]
    lose_loc_kill[i] = [value[1][i][0] for value in data.values()]
    lose_loc_die[i] = [value[1][i][1] for value in data.values()]
    lose_loc_assists[i] = [value[1][i][2] for value in data.values()]
# noinspection PyTypeChecker
win_avg_kill = [round(mean(kill), 2) for kill in win_loc_kill]
# noinspection PyTypeChecker
win_avg_die = [round(mean(die), 2) for die in win_loc_die]
# noinspection PyTypeChecker
win_avg_assists = [round(mean(assists), 2) for assists in win_loc_assists]
# noinspection PyTypeChecker
lose_avg_kill = [round(mean(kill), 2) for kill in lose_loc_kill]
# noinspection PyTypeChecker
lose_avg_die = [round(mean(die), 2) for die in lose_loc_die]
# noinspection PyTypeChecker
lose_avg_assists = [round(mean(assists), 2) for assists in lose_loc_assists]
fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(20, 16), dpi=100)
x = range(len(location))
axs[0].bar([i-0.2 for i in x], win_avg_kill, width=0.2, color='b')
axs[0].bar(x, win_avg_die, width=0.2, color='r')
axs[0].bar([i+0.2 for i in x], win_avg_assists, width=0.2, color='g')
axs[1].bar([i-0.2 for i in x], lose_avg_kill, width=0.2, color='b')
axs[1].bar(x, lose_avg_die, width=0.2, color='r')
axs[1].bar([i+0.2 for i in x], lose_avg_assists, width=0.2, color='g')
for a, b in zip(x, win_avg_kill):
    axs[0].text(a-0.2, b+0.1, '%.02f' % b, ha='center', va='bottom', fontsize=14)
for a, b in zip(x, win_avg_die):
    axs[0].text(a, b+0.1, '%.02f' % b, ha='center', va='bottom', fontsize=14)
for a, b in zip(x, win_avg_assists):
    axs[0].text(a+0.2, b+0.1, '%.02f' % b, ha='center', va='bottom', fontsize=14)
for a, b in zip(x, lose_avg_kill):
    axs[1].text(a-0.2, b+0.1, '%.02f' % b, ha='center', va='bottom', fontsize=14)
for a, b in zip(x, lose_avg_die):
    axs[1].text(a, b+0.1, '%.02f' % b, ha='center', va='bottom', fontsize=14)
for a, b in zip(x, lose_avg_assists):
    axs[1].text(a+0.2, b+0.1, '%.02f' % b, ha='center', va='bottom', fontsize=14)
for i in range(2):
    axs[i].xaxis.set_major_locator(ticker.FixedLocator(x))
    axs[i].xaxis.set_major_formatter(ticker.FixedFormatter(location))
    axs[i].set_yticks(range(0, 11, 2))
    axs[i].grid(linestyle="--", alpha=0.5)
    axs[i].legend(['擊殺', '死亡', '助攻'], loc='upper left', fontsize=16, markerscale=0.5)
    axs[i].set_xlabel("位置", fontsize=18)
    axs[i].set_ylabel("場均數(shù)據(jù)", fontsize=18, rotation=0)
axs[0].set_title("S10總決賽勝方各位置場均數(shù)據(jù)", fontsize=18)
axs[1].set_title("S10總決賽負方各位置場均數(shù)據(jù)", fontsize=18)
plt.show()

反序列化代碼也只有兩行,打開文件S10.pkl,然后使用load()方法對文件對象反序列化,返回數(shù)據(jù)。打開文件對象時使用rb模式。

運行代碼,繪圖功能正常。

經(jīng)過pickle模塊的序列化和反序列化,將數(shù)據(jù)持久化到了文件S10.pkl中。實現(xiàn)了數(shù)據(jù)與代碼的分離,避免了直接在代碼中寫一個很長的字典數(shù)據(jù),代碼更加優(yōu)雅。

在上面的例子中,對一個56行的數(shù)據(jù)進行序列化,已經(jīng)有不錯的效果了。在實際的項目中,數(shù)據(jù)更大,將數(shù)據(jù)放到代碼中會占很大的篇幅,進行序列化處理的優(yōu)化效果會更明顯。

如果有多個腳本使用同一份數(shù)據(jù),可以直接讀取同一個序列化數(shù)據(jù)文件,避免了在不同腳本中粘貼同一份數(shù)據(jù)。

到此這篇關于淺談Python使用pickle模塊序列化數(shù)據(jù)優(yōu)化代碼的方法的文章就介紹到這了,更多相關Python的pickle模塊序列化數(shù)據(jù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python如何通過正則匹配指定字符開頭與結束提取中間內容

    python如何通過正則匹配指定字符開頭與結束提取中間內容

    這篇文章主要介紹了python通過正則匹配指定字符開頭與結束提取中間內容的操作方法,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • 使用Python判斷一個文件格式的多種實現(xiàn)方案

    使用Python判斷一個文件格式的多種實現(xiàn)方案

    本文將以圖片文件為例,為大家系統(tǒng)介紹一下五種用Python判斷文件真實格式的方法,并分析它們的優(yōu)缺點,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2026-03-03
  • python網(wǎng)絡爬蟲采集聯(lián)想詞示例

    python網(wǎng)絡爬蟲采集聯(lián)想詞示例

    這篇文章主要介紹了python網(wǎng)絡爬蟲采集聯(lián)想詞示例,需要的朋友可以參考下
    2014-02-02
  • Python五種下劃線詳解

    Python五種下劃線詳解

    這篇文章主要介紹了Python下劃線5種含義實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-10-10
  • 使用Python構建MCP服務器的詳細配置步驟

    使用Python構建MCP服務器的詳細配置步驟

    模型控制協(xié)議(MCP)是一種專為實現(xiàn)AI代理與工具解耦而設計的通信協(xié)議,為AI驅動應用程序的開發(fā)提供了高度的靈活性和模塊化架構,本文將詳細介紹MCP服務器的構建過程,包括工具函數(shù)的注冊、配置以及與Claude Desktop等AI代理的集成,需要的朋友可以參考下
    2025-06-06
  • Python處理.nfo文件格式的完整教程

    Python處理.nfo文件格式的完整教程

    .nfo 文件是媒體文件的元數(shù)據(jù)容器,通常用于存儲電影、電視劇、音樂等多媒體信息的結構化數(shù)據(jù),它們本質上是 XML 格式的文本文件,包含如標題、演員、劇情簡介等關鍵信息,本文給大家詳細介紹了Python處理.nfo文件格式的完整教程,需要的朋友可以參考下
    2025-07-07
  • python使用nibabel和sitk讀取保存nii.gz文件實例

    python使用nibabel和sitk讀取保存nii.gz文件實例

    這篇文章主要介紹了python使用nibabel和sitk讀取保存nii.gz文件實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python裝飾器類方法擴展元類管理實例探究

    Python裝飾器類方法擴展元類管理實例探究

    這篇文章主要為大家介紹了Python裝飾器類方法擴展元類管理實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Python基礎教程之內置函數(shù)locals()和globals()用法分析

    Python基礎教程之內置函數(shù)locals()和globals()用法分析

    這篇文章主要介紹了Python基礎教程之內置函數(shù)locals()和globals()用法,結合實例形式分析了locals()和globals()函數(shù)的功能、使用方法及相關操作注意事項,需要的朋友可以參考下
    2018-03-03
  • Python字符串拼接六種方法介紹

    Python字符串拼接六種方法介紹

    這篇文章主要介紹了Python字符串拼接六種方法介紹,具有一定借鑒價值,需要的朋友看可以參考下。
    2017-12-12

最新評論

合阳县| 五河县| 蕲春县| 高州市| 通化县| 工布江达县| 浑源县| 江西省| 鄂尔多斯市| 武清区| 彭泽县| 长乐市| 皋兰县| 盐源县| 电白县| 苍山县| 海安县| 土默特右旗| 浦东新区| 含山县| 乐昌市| 抚州市| 周口市| 霍邱县| 阿鲁科尔沁旗| 安阳县| 库伦旗| 平凉市| 东乌| 蓬溪县| 永善县| 沈阳市| 松潘县| 年辖:市辖区| 台湾省| 博白县| 巴里| 青龙| 梁山县| 米脂县| 桃源县|