LoginSignup
252

More than 3 years have passed since last update.

posted at

updated at

Organization

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
252