Python
pickle
Chainer

PythonのPickleモジュールを理解したいだけの人生だった


What's Pickle

これ

image.jpeg

わぁーおいしそ〜

というボケはともかくとして、名前の由来はPicklesから来ており、オブジェクトを直列化することでオブジェクトの状態を保存することのできるPythonモジュールです。

最近深層学習の勉強をしており、頻繁に

train_list = load_image_list(args.train)

val_list = load_image_list(args.val)
mean_image = pickle.load(open(args.mean, 'rb'))

のようなコードと出会うことが多くなりました。

「pickleってなんのこと?」と思ったので、自分なりに調べたことをまとめます。

プログラミング全般的に知識が浅はかなので気になる記述があった方はご指摘ください。


オブジェクトのPickle化、非Pickle化(*)って何?

だいたいのことはドキュメントに書いてあります。

http://docs.python.jp/2/library/pickle.html

http://docs.python.jp/3/library/pickle.html

プログラムはその性質上、メモリ上で働き、役割を終えたらメモリから削除されます。

オブジェクトも役割を終えたらGCに削除されますし、そうでなくともプログラムが実行を終えたら消えてしまいます。

プログラムを実行し終えたあとも作成したオブジェクトを保存する機能を提供してくれるのがPickleモジュールです。

保存する方法としては、バイト列などにオブジェクトを変換してファイルに書き込みます。


実行例

簡単なクラスを書きます。


Singer.py

class Singer(object):

def __init__(self, lylics):
self.lylics = lylics
def sing(self):
print(self.lylics)


このクラスはインスタンス化すると


main.py

from singer import Singer

singer = Singer('Shanranran')
singer.sing()


$ main.py

$ 'Shanranran'

というように、コンストラクタに渡した歌詞を歌ってくれます。

もちろん、実行が終了した時点でSingerは歌詞を忘れてしまいます。

そこで、歌詞カードの代わりにオブジェクトの状態をPickleを使って保存します。


dump.py

import pickle

from singer import Singer

singer = Singer('Shanranran')

with open('singer.pickle', 'wb') as f:
pickle.dump(singer, f)


Singerオブジェクトの状態をsinger.pickleというバイナリファイルにすることで、dump.pyが終了したあともオブジェクトの状態を保存できます。これがPickle化です。

オブジェクトの非Pickle化にはloadメソッドを使うのですが、


load.py

import pickle

with open('singer.pickle', 'rb') as f:
singer = pickle.load(f)

singer.sing()


$ python load.py

$ Shanranran

というようにdump.py実行時のSingerオブジェクトの状態が保存されていることが確認できました。


おわりに

簡単にPickleモジュールについて書きましたが、これはほんの序の口で、本格的に使う場合には気をつけなければならないことがまだまだあります。

私自身、勉強中なので、また調べたときに書きたいと思います。


参考

12.1. pickle — Python オブジェクトの直列化

http://docs.python.jp/3/library/pickle.html

11.1. pickle — Python オブジェクトの直列化

http://docs.python.jp/2/library/pickle.html

Python: オブジェクトを漬物 (Pickle) にする

http://blog.amedama.jp/entry/2015/12/05/132520

*直列化、平坦化、整列化など呼び方がいろいろ存在するが、ここでは公式ドキュメントに合わせた。