python存取dict
前言
這裡的方法同樣可以儲存陣列或者別的陣列,這裡主要以字典為主要物件。
正文
pickle,numpy都可以進行檔案持久化。
編寫以下程式碼測試效能
import numpy as np
import pickle as pkl
import time
a = {
'a': np.random.randn(8000, 2, 30, 160),
'b': np.random.randn(8000, 2, 30, 160),
'c': np.random.randn(8000, 2, 30, 160),
'd': np.random.randn(8000, 2, 30, 160),
'e': np.random.randn(8000, 2, 30, 160),
}
time_a = time.time()
np.save('data.npy', a)
time_b = time.time()
np.save('data.npy', a)
time_c = time.time()
print('numpy 儲存耗時:{}'.format(time_b-time_a))
print('numpy 讀取耗時:{}'.format(time_c-time_b))
time_a = time.time()
with open('data.pkl', 'wb') as f:
pkl.dump(a, f, protocol=pkl.HIGHEST_PROTOCOL)
time_b = time.time()
with open('data.pkl', 'rb') as f:
a = pkl.load(f)
time_c = time.time()
print('pickle 儲存耗時:{}'.format(time_b-time_a))
print('pickle 讀取耗時:{}'.format(time_c-time_b))
執行結果為:
numpy 儲存耗時:3.349184274673462
numpy 讀取耗時:4.978081941604614
pickle 儲存耗時:6.070725202560425
pickle 讀取耗時:2.0159759521484375
檔案大小比較,首先是numpy的大小為:
pickle大小為:
pickle的儲存效能比numpy慢兩倍,讀取快兩倍。最後儲存的檔案大小一樣。
然後探究儲存後的檔案大小與存取效能之間的關係,首先更改程式碼為:
import numpy as np
import pickle as pkl
import time
import matplotlib.pyplot as plt
import os
x = []
np_save = []
np_load = []
pkl_save = []
pkl_load = []
s = time.time()
for i in range(25):
size = 1000 * (i + 1)
a = {
'a': np.random.randn(size, 2, 30, 160),
'b': np.random.randn(size, 30, 160),
'c': np.random.randn(size, 2, 30, 160),
'd': np.random.randn(size, 2, 30, 160),
'e': np.random.randn(size, 2, 30, 160),
}
time_a = time.time()
np.save('data.npy', a)
time_b = time.time()
np.save('data.npy', a)
time_c = time.time()
np_save.append(time_b-time_a)
np_load.append(time_c-time_b)
time_a = time.time()
with open('data.pkl', 'wb') as f:
pkl.dump(a, f, protocol=pkl.HIGHEST_PROTOCOL)
time_b = time.time()
with open('data.pkl', 'rb') as f:
a = pkl.load(f)
time_c = time.time()
pkl_save.append(time_b-time_a)
pkl_load.append(time_c-time_b)
x.append(os.path.getsize('data.npy') / (1024. * 1024. * 1024.))
plt.figure()
ax1 = plt.subplot(211)
ax1.plot(x, np_save, label='numpy')
ax1.plot(x, pkl_save, label='pickle')
plt.xlabel('size (G)')
plt.ylabel('save time (s)')
plt.legend()
ax2 = plt.subplot(212)
ax2.plot(x, np_load, label='numpy')
ax2.plot(x, pkl_load, label='pickle')
plt.xlabel('size (G)')
plt.ylabel('load time (s)')
plt.legend()
print(time.time()-s)
plt.show()
結果為:
可以看出,pickle在讀取上一直佔優,即使檔案較大,讀取時間上升也較為平緩。在儲存上兩者拉不開明顯差距,但一般來看numpy是有優勢的,比如我們不管後面的劇烈上升,而是看較為平緩的一段:
可以看出numpy在讀取上,6g以下是明顯佔優的,6g以上兩者會難分難解
觀察發現,大檔案還是使用pickle比較好
相關文章
- Python dict(字典)Python
- Python中字典dictPython
- Python中的dictPython
- Python字典dict用法Python
- python中dict詳解Python
- Python基礎:dict & setPython
- dict字典常用操作(python)Python
- python字典dict操作方法Python
- 小白學python系列-(8)dictPython
- Python list,dict問題解答Python
- 草根學Python(四) Dict 和 SetPython
- Python 的List 和tuple,Dict,SetPython
- python 中字典dict如何新增元素?Python
- python之字典(dict)基礎篇Python
- 【廖雪峰python入門筆記】dictPython筆記
- 7.Python3原始碼—Dict物件Python原始碼物件
- python dict實現的魔法方法Python
- Python3 dict和str互轉Python
- python中類和物件的__dict__Python物件
- Python 4 種不同的存取檔案騷操作Python
- Python中dict支援多個key的方法Python
- Python - 基礎資料型別 dict 字典Python資料型別
- python中的list,tuple,set和dict(參考python文件)Python
- 【Python從入門到精通】(七)Python字典(dict)讓人人都Python
- Python 字典 dict 獲取索引 轉化為 listPython索引
- 字典dict
- python的dir()和__dict__屬性的區別Python
- Python中字典dict的11種不同操作方法Python
- Python 列表表示式中正確使用 dict.updatePython
- python內建物件型別(四)序列之dict字典Python物件型別
- union存取低高位
- dict和set
- dict pop 原理
- Python 內建型別 dict, list 執行緒安全嗎Python型別執行緒
- python例項屬性的顯示方法-dir、__dict__Python
- 深入javascript資料存取JavaScript
- Missing key(s) in state_dict: Unexpected key(s) in state_dict
- Python程式設計:Counter計數器-dict字典的子類Python程式設計