はじめに
シリアライズをpickleで行って高速化に関しての備忘録です。
コードを書き始めて1年以内の若輩者です😅
もし間違いがあれば、ご指摘いただけると助かります🙇
🦁結論🦁
データの蓄積や膨大なデータの読込を早くするためにシリアライズすることで読込、書込を早くすることができる。
Pythonでは標準ライブラリで「pickle」がある。
データが大きくなった場合には非常に便利なライブラリ。
また文字列もそのまま保管できる。
押さえておくべき点
- シリアライズとはデータ一つのバイト列(バイナリデータ)に変換するプロセスのことを指す(他の形式もある)
- pickleファイルはバイナリモードで読み書きする必要がある。
- バイナリデータでの読み書きは処理が早くなる。
- 数行のコードでデータを保存・読み込みできる。
- 大量のデータも素早く保存・読み込みができる。
- テキストだけでなく、リストや辞書なども扱える。
- 自動的にデータを圧縮して小さくできることがある。
利用シーン
- 大量のデータを一時保存したいとき
- データ分析の中間結果を保存したいとき
- 機械学習モデルを保存したいとき
- 設定情報の保存したいとき
- セッション情報の保存したいとき
注意点
- 異なるPythonバージョン間でpickleファイルを交換すると、問題が起こることがある。
- テキストよりもバイナリデータの方が大きくなることがある。
- 人間が直接読むことができないバイナリ形式で保存される。
- pickleで保存されたデータは、Python以外では読み込めない。
基本コード
膨大な数値データリストも一次保存としておいて置くデータとしても非常に簡単に操作でき、様々なデータをそのままの型を維持して保管できる。リストはもちろん、辞書も可能。
.pickleというファイルに保存される(.pkl)
import pickle
# 保存したいデータ
my_data = {'key': 'value', 'number’: 42}
# データをバイナリ形式でファイルに保存する
with open(‘data.pickle’, ‘wb’) as file:
pickle.dump(my_data, file)
#ファイルからデータを読み込む
with open(‘data.pickle’, ‘rb’) as file:
loaded_data = pickle.load(file)
print(loaded_data)
# {‘key’: ‘value’, ‘number’: 42} と表示される
文字
import pickle
# 文字列データ
greeting = "こんにちは、世界!"
# 文字列をバイナリ形式でファイルに保存
with open('greeting.pickle', 'wb') as file:
pickle.dump(greeting, file)
# ファイルから文字列を読み込む
with open('greeting.pickle', 'rb') as file:
loaded_greeting = pickle.load(file)
print(loaded_greeting) # "こんにちは、世界!" と表示されます
辞書データ
辞書データもそのまま保存可能。
import pickle
# 辞書を作成
my_friends = {
'Alice': '123-456-7890',
'Bob': '987-654-3210',
'Charlie': '555-555-5555'
}
# 辞書をファイルに保存
with open('friends.pickle', 'wb') as f:
pickle.dump(my_friends, f)
# ファイルから辞書を読み込む
with open('friends.pickle', 'rb') as f:
loaded_friends = pickle.load(f)
print(loaded_friends) # 保存した辞書が表示されます
クラスのオブジェクト
import pickle
# ペットを表すクラスを定義
class Pet:
def __init__(self, name, animal_type):
self.name = name
self.animal_type = animal_type
# ペットのインスタンスを作成
my_pet = Pet('Fido', 'dog')
# インスタンスをファイルに保存
with open('pet.pickle', 'wb') as f:
pickle.dump(my_pet, f)
# ファイルからインスタンスを読み込む
with open('pet.pickle', 'rb') as f:
loaded_pet = pickle.load(f)
print(loaded_pet.name, loaded_pet.animal_type) # 'Fido dog' と表示されます
まとめ✍️
機械語に直すだけで処理が早くなるとはすごいなと思った。速度も全然違うこともビックリした。
これからどんどん使っていきたい。