<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python怎樣存儲變量性能最優(yōu)?這篇文章告訴你答案

          共 3071字,需瀏覽 7分鐘

           ·

          2022-10-20 01:36

          工作時我們經(jīng)常會遇到需要臨時保存結(jié)果變量的場景,尤其是一些數(shù)據(jù)處理、模型開發(fā)的場景,加載處理速度是個很漫長的過程,于是經(jīng)常會把這些變量儲存起來。

          而儲存變量最常見、最普遍的方法是用pickle,保存為pkl文件。但是如果從寫入和讀取的性能角度考慮,pkl可能真的不是最優(yōu)選。

          Pickle有其獨特的好處,大部分變量不需要進行處理,都能直接存到pkl文件里,但這樣的方便其實是犧牲了部分性能取得的。與之相比,numpy的.npy格式就比pickle性能上快不少。

          當(dāng)然,我們需要有證據(jù)支撐這個觀點。所以今天我們就來做個實驗,分別在Python2和Python3中對比 numpy 和 pickle 兩種存儲格式(.npy, .pkl) 對數(shù)據(jù)的存儲和讀取的性能對比。

          部分內(nèi)容參考分析自: https://applenob.github.io/python/save/

          1. Python2中, npy與pkl的性能對比



          首先初始化數(shù)據(jù):

          import numpy as np
          import time
          import cPickle as pkl
          import os

          all_batches = []
          for i in range(20):
              a1 = np.random.normal(size=[25600, 40])
              label = np.random.normal(size=[25600, 1])
              all_batch = np.concatenate([a1, label], 1)
              all_batches.append(all_batch)
          all_batches = np.array(all_batches)
          print(all_batches.shape)
          # (20, 25600, 41)


          然后測試使用pickle保存和讀取時間的耗時,以及整個文件的大小:

          s_t1 = time.time()
          pkl_name = "a.pkl"
          with open(pkl_name, "wb") as f:
              pkl.dump(all_batches, f)
          pkl_in_time = time.time() - s_t1
          print("pkl dump costs {} sec".format(pkl_in_time))

          s_t2 = time.time()
          with open(pkl_name, "rb") as f:
              new_a = pkl.load(f)
          pkl_out_time = time.time() - s_t2
          print("pkl load costs {} sec".format(pkl_out_time))

          pkl_size = os.path.getsize(pkl_name)
          print("pkl file size: {} byte, {} mb".format(pkl_size, float(pkl_size)/(1024*1024)))


          結(jié)果如下:


          即:

          pkl dump costs 67.7483091354 sec
          pkl load costs 52.1168899536 sec
          pkl file size: 497437110 byte, 474.392995834 mb


          然后再試一下npy的寫入和讀取:

          s_t3 = time.time()
          npy_name = "a.npy"
          with open(npy_name, "wb") as f:
              np.save(f, arr=all_batches)
          npy_in_time = time.time() - s_t3
          print("npy save costs {} sec".format(npy_in_time))
          s_t4 = time.time()
          with open(npy_name, "rb") as f:
              new_a = np.load(f)
          npy_out_time = time.time() - s_t4
          print("npy load costs {} sec".format(npy_out_time))
          npy_size = os.path.getsize(npy_name)
          print("npy file size: {} byte, {} mb".format(npy_size, float(npy_size) / (1024 * 1024)))


          結(jié)果如下:


          即:

          npy save costs 20.718367815 sec
          npy load costs 0.62314915657 sec
          npy file size: 167936128 byte, 160.15637207 mb


          結(jié)果發(fā)現(xiàn),npy性能明顯優(yōu)于pkl格式。

          通過多次測試發(fā)現(xiàn),在Python2中,npy格式的性能優(yōu)勢全面碾壓pkl,工程允許的情況下,在Python2中,我們應(yīng)該在這二者中毫不猶豫地選擇npy.

          2.Python3中, npy與pkl的性能對比



          Python2已經(jīng)是過去式,重點還要看Python3.

          在Python3中,與Python2的代碼唯一一句不一樣的是pickle的引入:

          # Python2:
          import cPickle as pkl

          # Python3:
          import pickle as pkl


          其他代碼基本一樣,替換代碼后,重新運行程序,讓我們看看在Python3上,npy格式和pkl格式性能上的區(qū)別,首先是pkl格式的表現(xiàn):

          ckenddeMacBook-Pro:Documents ckend$ python 1.py 
          (20, 25600, 41)
          pkl dump costs 24.32167887687683 sec
          pkl load costs 4.480823040008545 sec
          pkl file size: 167936163 byte, 160.15640544891357 mb


          然后是npy格式的表現(xiàn):

          npy save costs 22.471696853637695 sec
          npy load costs 0.3791017532348633 sec
          npy file size: 167936080 byte, 160.1563262939453 mb


          可以看到在Python3中pkl格式和npy格式的存儲大小是基本相同的,在存儲耗時上也相差無幾。但是在讀取數(shù)據(jù)的時候,npy相對于pkl還是有一定的優(yōu)勢的。

          因此,如果你的程序非常注重讀取效率,那么我覺得npy格式會比pkl格式更適合你。


          Wang
          Qi
          Tui
          Jian


          1、手機還卡?老手機救星!游戲火力全開!

          2、突發(fā)!歐盟新規(guī) 蘋果終于認(rèn)輸

          3、高德骨子里還是個「理工男」

          4、靈動島這個騷操作,被封殺了!

          5、40 行 Python 代碼,寫一個 CPU!


          點擊關(guān)注公眾號,閱讀更多精彩內(nèi)容


          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  百度一下| 亚洲艹逼网站 | 日日久一区二区三区 | 99视频在线免费 | 国产成人精品白浆久久69 |