Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

hatt0519
Android開発しています。
mixi
全ての人に心地よいつながりを
http://mixi.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした