1. 程式人生 > >Python+不同的資料儲存方式比較

Python+不同的資料儲存方式比較

本文來探索一下python中提供的各種資料儲存格式的效能如何。主要以一個 ndarray 格式的資料進行處理分析。包括下面幾種方式:

  • .bin格式, np.tofile() 和 np.fromfile()
  • .npy格式,np.save() 和 np.load()
  • .txt 或者 .csv格式,np.savetxt() 和 np.loadtxt()
  • .h5 格式,h5py.File(,’r’ 或者 ‘w’)
  • .pkl 格式, pickle.dump()和pickle.load()
import numpy as np
from __future__ import print_function
import
time
a = np.random.randint(0, 100, size=(10000, 5000))
print(a.dtype, a.shape)
print(a[:2])
int64 (10000, 5000)
[[90 96 38 ..., 67 40 79]
 [40 12 71 ..., 64 76 15]]

1. np.tofile() 和 np.fromfile()

%time a.tofile('data/a.bin')
%time b = np.fromfile('data/a.bin', dtype=np.int64)
print(b.shape)
print(b[:2])
CPU times: user 4 ms, sys: 392 ms, total: 396 ms
Wall time: 2.06 s
CPU times: user 4 ms, sys: 156 ms, total: 160 ms
Wall time: 160 ms
(50000000,)
[90 96]
  • 讀入資料的時候要正確設定 dtype 引數

  • 讀入的資料是一維的,還需要經過 reshape 處理。

2. np.save()和np.load()

%time np.save('data/a.npy', a)
%time b = np.load('data/a.npy')
print(b.shape)
print(b[:2])
CPU times: user 0 ns, sys: 272 ms, total: 272 ms
Wall time: 269 ms
CPU times: user 0 ns, sys: 116 ms, total: 116 ms
Wall time: 116 ms
(10000, 5000)
[[90 96 38 ..., 67 40 79]
 [40 12 71 ..., 64 76 15]]
  • NumPy專用的二進位制格式儲存資料,它們會自動處理元素型別和形狀等資訊.

使用 np.savez() 儲存多個矩陣至一個檔案中:

a = np.asarray([[1,2], [3,4]])
b = np.asarray([0,1])
np.savez('data.npz', X=a, y=b)
# 匯入
data = np.load('data.npz')
a = data['X']
b = data['y']

3. np.savetxt()和np.loadtxt()

%time np.savetxt('data/a.txt', a, fmt='%d', delimiter=',')  # 設定以整數形式儲存,以逗號隔開
%time b = np.loadtxt('data/a.txt', delimiter=',')
print(b.shape)
print(b[:2])
CPU times: user 18.4 s, sys: 60 ms, total: 18.5 s
Wall time: 18.4 s
CPU times: user 55.9 s, sys: 476 ms, total: 56.4 s
Wall time: 56.3 s
(10000, 5000)
[[ 90.  96.  38. ...,  67.  40.  79.]
 [ 40.  12.  71. ...,  64.  76.  15.]]
  • 讀寫1維和2維陣列的文字檔案

4.h5py.File()

import h5py

time0 = time.time()
f = h5py.File('data/a.h5','w')   #建立一個h5檔案,檔案指標是f  
f['data'] = a                    #將資料寫入檔案的主鍵data下面  
f.close()                        #關閉檔案  
print('saving time %.2fs' % (time.time() - time0))
time cost 0.26s
time0 = time.time()
f = h5py.File('data/a.h5','r')   #開啟h5檔案  
# print f.keys()                      #可以檢視所有的主鍵  
b = f['data'][:]                    #取出主鍵為data的所有的鍵值  
f.close()  
print('loading time %.2fs' % (time.time() - time0))
print(b.shape)
print(b[:2])
loading time 0.15s
(10000, 5000)
[[90 96 38 ..., 67 40 79]
 [40 12 71 ..., 64 76 15]]

5.pickle.dump()和pickle.load()

import pickle
with open('data/a.pkl', 'wb') as outp:
    %time pickle.dump(a, outp)

with open('data/a.pkl', 'rb') as inp:
    %time b = pickle.load(inp)

print(b.shape)
print(b[:2])
CPU times: user 30.1 s, sys: 5.92 s, total: 36.1 s
Wall time: 36.1 s
CPU times: user 6.84 s, sys: 10.4 s, total: 17.2 s
Wall time: 17.2 s
(10000, 5000)
[[90 96 38 ..., 67 40 79]
 [40 12 71 ..., 64 76 15]]

結果統計

方法 檔案格式 大小 寫入耗時 讀入耗時 需要處理型別? 需要處理形狀?
np.tofile() .bin 381.47MB 2.06 s 160 ms
np.save() .npy 381.47MB 269 ms 116 ms
np.savetxt() .txt 138.28MB 18.4 s 56.3 s
h5py.File() .h5 381.47MB 260ms 150ms
pickle.dump() .pkl 1.39GB 36.1 s 17.2 s

需要說明的是,第一次匯入資料後在一段時間內會儲存在快取中,這時候再次匯入會非常非常快。所以在訓練神經網路的時候,使用 np.load() 的方式匯入資料,除了第一個 epoch 速度會慢一些,後面讀取資料的速度非常快。

  • 總體上最優的方法是使用 np.save() 和 h5py.File(, ‘r’ or ‘w’);np.savez() 可以儲存多個值, 而 h5py 提供字典的方式儲存更是非常方便。
  • txt 和 csv 文字檔案佔用的空間是最少的,但是耗時非常大
  • np.tofile() 方法要處理資料的型別和形狀,很煩,可以放棄了
  • pickle() 的 .pkl 檔案非常非常佔空間,而且巨慢,直接放棄!!

非對齊的 ndarray 資料儲存

import h5py

list_a = [[1,2,3], [4,5], [77]]
arr_a = np.asarray(list_a)
arr_a
array([[1, 2, 3], [4, 5], [77]], dtype=object)
# 無法儲存長度不同的 ndarray
f = h5py.File('data/arr_a.h5', 'w')
f['arr_a'] = arr_a  # 報錯,每個元素都是 Object。
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-7-0a946c2e9c3c> in <module>()
      1 f = h5py.File('data/arr_a.h5', 'w')
----> 2 f['arr_a'] = arr_a  # 報錯, 無法儲存長度不同的 ndarray
... 
TypeError: Object dtype dtype('O') has no native HDF5 equivalent
np.save('data/arr_a.npy', arr_a)
b = np.load('data/arr_a.npy')
print(b)
[[1, 2, 3] [4, 5] [77]]

通過上面的比較,我們可以看到 np.save() 非常強大呀,沒辦法,只好選擇它了。

參考

相關推薦

Python+不同資料儲存方式比較

本文來探索一下python中提供的各種資料儲存格式的效能如何。主要以一個 ndarray 格式的資料進行處理分析。包括下面幾種方式: .bin格式, np.tofile() 和 np.fromfile() .npy格式,np.save() 和 np.load

python 寫爬蟲 爬取得資料儲存方式

mysql: 首先配置檔案: ITEM_PIPELINES = { firstbloodpro.pipelines.MysqlproPipeline:300},配置好管道 第二配置好所需要的使用者名稱等 HOST='localhost' POST=3306 USE

Spark Streaming結合 Kafka 兩種不同資料接收方式比較

DirectKafkaInputDStream 只在 driver 端接收資料,所以繼承了 InputDStream,是沒有 receivers 的 在結合 Spark Streaming 及 Kafka 的實時應用中,我們通常使用以下兩個 API 來獲取最初的 DStream(這裡不關心這兩個 API 的

Python中scrapy爬蟲框架的資料儲存方式(包含:圖片、檔案的下載)

注意:1、settings.py中ITEM_PIPELINES中數字代表執行順序(範圍是1-1000),引數需要提前配置在settings.py中(也可以直接放在函式中,這裡主要是放在settings.py中),同時settings.py需要配置開啟2、 process_it

11.1 js中級,資料型別、資料儲存方式、作用域記憶體空間的區別以及例識別。

一. 基本資料型別和引用資料型別的區別。     1.基本資料型別:基本資料型別就是簡單的操作值。     2.引用資料型別:就是把引用的地址賦給變數。   堆記憶體:     就是存放程式碼塊的,存放形式有兩種       1)物件以鍵值對的形式存放       2)引用資料型別的賦值,是把引用

Android 資料持久化技術(即資料儲存方式

在討論資料持久化技術之前我們先了解幾個概念? 什麼是瞬時資料:儲存在記憶體當中,有可能會因為程式的關閉或其他原因導致記憶體被收回而丟失的資料。   為什麼採用資料持久化技術:為了保證關鍵資料在程式退出時不被丟失。   什麼是資料持久化技術:將記憶體中的瞬時資料

Android五種資料儲存方式之SQLite資料庫儲存 載入SD卡資料庫 sql操作 事務 防止SQL注入

資料庫 前言 資料庫儲存 資料庫建立 內建儲存資料庫 外接儲存資料庫 編寫DAO 插入操作 更新操作 刪除操作 查詢操作

Android五種資料儲存方式之檔案儲存 內部儲存 外部儲存 檔案讀取儲存操作封裝

檔案儲存 前言 檔案儲存 記憶體 內部儲存 外部儲存 內部儲存操作 API 讀寫操作 外部儲存操作 公共目錄 私有目錄

C語言變數定義與微控制器資料儲存方式

說明:文章來源 EDN電子技術設計:嵌入式程式開發需要知道的儲存器知識 MCU 中常使用的儲存器型別有:FLASH、RAM、ROM(包括EEPROM) 在軟體角度來看,程式和資料的儲存分為以下幾個部分 程式碼段和常量段都可以用於儲存常量資料,其主要區

python資料儲存

python 資料儲存 資料儲存的方式 對於python的檔案儲存具有很多形式,主要的有TXT,JSON,CSV格式,除此之外還可以儲存到資料庫中 思路分析 1:txt儲存 目的:儲存知乎上面的"發現"頁面的“熱門話題”部分 使用requests獲取網

ios應用資料儲存方式(偏好設定)-轉

一.簡單介紹 1.很多ios應用都支援偏好設定,比如儲存使用者名稱,密碼,字型大小等設定,ios提供了一套標準的解決方案來為應用加入偏好設定功能。 2.每個應用都有個NSUserDefaults例項,通過它來儲存偏好設定。比如,儲存使用者名稱,字型大小,是否自動登入。 3.儲存位

資料儲存方式之 TXT 文字

Java 操作檔案輸入流與輸出流,具體內容包括 File 類、檔案位元組流與字元流、緩衝流。最後以網路爬蟲實戰案例,講解其具體的使用方式。 輸入流、輸出流簡介 在 Java 中,流是從源到目的地的位元組的有序序列。Java 中有兩種基本的流——輸入流和輸出流。輸

python常見資料儲存 csv txt pickle

1.csv檔案 (1)寫入 import csv with open('test.csv', 'w', newline='', encoding='utf-8') as wf: # 用csv檔案包裝 writer = csv.writer(wf) # 建立標頭檔案 he

HashMap存入相同key的兩種不同儲存方式

今天在看《程式設計思想》關於HashMap章節的keySet()方法的時候,突然想到一個問題,既然key的儲存方式是Set不可重複的,那麼如果相同的Key下儲存了多個值,原始碼中對於這樣的邏輯是怎樣考慮的呢? import java.util.HashMap; impor

Python + Mongodb資料儲存

導言:一直在用MySQL,聽說Mongodb非常不錯,一直在工作中沒用到,這個週末來玩玩 Mongodb安裝 window平臺安裝 MongoDB: MongoDB提供了可用於32位和64位系統的

資料儲存方式與記憶體分配方式

資料儲存方式: 1、未初始化的全域性變數(.bss段) 2、初始化過的全域性變數(.data段) 3、常量資料(.rodata段) 4、程式碼(.text段) 5、棧(stack) 6、堆(heap) 記憶體分配方式: 1、從靜態儲存區域分配。記憶體在程式編譯時就已經

Python爬蟲資料提取方式——cssselector樣式選擇器

cssselector:和xpath是使用比較多的兩種資料提取方式。cssselector是css樣式選擇器實現的!scrapy爬蟲框架:支援xpath/csspyspider爬蟲框架:支援PyQuer

python爬蟲#資料儲存#JSON/CSV/MYSQL/MongoDB/

Json資料處理 JSON支援資料格式: 物件(字典)。使用花括號。 陣列(列表)。使用方括號。 整形、浮點型、布林型別還有null型別。 字串型別(字串必須要用雙引號,不能用單引號)。 多個數據之間使用逗號分開。 注意:json本質上就是一個字串。 字典和列表轉JSON: import json boo

python爬蟲資料儲存到本地各種格式的方法

最近爬蟲又解決了很多問題,算是儲存這部分的吧。 首先,我們如果想要抓取本地txt檔案中的內容拿到特定網址去搜索。然後爬取搜尋結果的話,這個很簡單: f=open('C://Python27//1.txt')           #只需要通過這句程式碼開啟你本地對應路徑的檔案

IOS的四種資料儲存方式及優劣

IOS有四種常用資料儲存方式: 第一種方法:用NSUserDefaults儲存配置資訊 NSUserDefaults被設計用來儲存裝置和應用的配置資訊,它通過一個工廠方法返回預設的、也是最常用到的例項物件。這個物件中儲存了系統中使用者的配置資訊,開發者可以通