工作時(shí)我們經(jīng)常會(huì)遇到需要臨時(shí)保存結(jié)果變量的場(chǎng)景,尤其是一些數(shù)據(jù)處理、模型開發(fā)的場(chǎng)景,加載處理速度是個(gè)很漫長(zhǎng)的過程,于是經(jīng)常會(huì)把這些變量?jī)?chǔ)存起來。
而儲(chǔ)存變量最常見、最普遍的方法是用pickle,保存為pkl文件。但是如果從寫入和讀取的性能角度考慮,pkl可能真的不是最優(yōu)選。
Pickle有其獨(dú)特的好處,大部分變量不需要進(jìn)行處理,都能直接存到pkl文件里,但這樣的方便其實(shí)是犧牲了部分性能取得的。與之相比,numpy的.npy格式就比pickle性能上快不少。
當(dāng)然,我們需要有證據(jù)支撐這個(gè)觀點(diǎn)。所以今天我們就來做個(gè)實(shí)驗(yàn),分別在Python2和Python3中對(duì)比 numpy 和 pickle 兩種存儲(chǔ)格式(.npy, .pkl) 對(duì)數(shù)據(jù)的存儲(chǔ)和讀取的性能對(duì)比。
1. Python2中, npy與pkl的性能對(duì)比
首先初始化數(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)
然后測(cè)試使用pickle保存和讀取時(shí)間的耗時(shí),以及整個(gè)文件的大?。?/p>
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格式。
通過多次測(cè)試發(fā)現(xiàn),在Python2中,npy格式的性能優(yōu)勢(shì)全面碾壓pkl,工程允許的情況下,在Python2中,我們應(yīng)該在這二者中毫不猶豫地選擇npy.
2.Python3中, npy與pkl的性能對(duì)比
Python2已經(jīng)是過去式,重點(diǎn)還要看Python3.
在Python3中,與Python2的代碼唯一一句不一樣的是pickle的引入:
# Python2:
import cPickle as pkl
# Python3:
import pickle as pkl
其他代碼基本一樣,替換代碼后,重新運(yùn)行程序,讓我們看看在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格式的存儲(chǔ)大小是基本相同的,在存儲(chǔ)耗時(shí)上也相差無幾。但是在讀取數(shù)據(jù)的時(shí)候,npy相對(duì)于pkl還是有一定的優(yōu)勢(shì)的。
因此,如果你的程序非常注重讀取效率,那么我覺得npy格式會(huì)比pkl格式更適合你。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7157瀏覽量
89643 -
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4358瀏覽量
86196 -
python
+關(guān)注
關(guān)注
56文章
4809瀏覽量
85054
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
python環(huán)境變量的配置pip
怎樣才能使本本達(dá)到最優(yōu)性能
python環(huán)境變量設(shè)置
![<b class='flag-5'>python</b>環(huán)境<b class='flag-5'>變量</b>設(shè)置](https://file1.elecfans.com//web2/M00/A6/ED/wKgZomUMQUyAM5cxAABI7VPK7G4647.png)
Python的常量與變量基礎(chǔ)知識(shí)詳解
python設(shè)置環(huán)境變量
Python私有變量的定義方法
Python的變量類型詳細(xì)資料說明
![<b class='flag-5'>Python</b>的<b class='flag-5'>變量</b>類型詳細(xì)資料說明](https://file.elecfans.com/web1/M00/C4/C3/o4YBAF9DfhGAT8twAAUam59hEqs941.png)
python變量的作用域
如何配置Python環(huán)境變量
Python怎樣存儲(chǔ)變量性能最優(yōu)
![<b class='flag-5'>Python</b><b class='flag-5'>怎樣</b><b class='flag-5'>存儲(chǔ)</b><b class='flag-5'>變量</b><b class='flag-5'>性能</b><b class='flag-5'>最優(yōu)</b>](https://file1.elecfans.com/web2/M00/A8/99/wKgaomUuAIWAVzaCAAAVDT-YYpE694.jpg)
評(píng)論