web-dev-qa-db-ja.com

Python pickle protocol choice?

私はpython 2.7を使用してオブジェクトをピクルスしようとしています。ピクルスプロトコルの本当の違いは何なのでしょうか。

import numpy as np
import pickle
class data(object):
    def __init__(self):
        self.a = np.zeros((100, 37000, 3), dtype=np.float32)

d = data()
print "data size: ", d.a.nbytes/1000000.
print "highest protocol: ", pickle.HIGHEST_PROTOCOL
pickle.dump(d,open("noProt", 'w'))
pickle.dump(d,open("prot0", 'w'), protocol=0)
pickle.dump(d,open("prot1", 'w'), protocol=1)
pickle.dump(d,open("prot2", 'w'), protocol=2)


out >> data size:  44.4
out >> highest protocol:  2

その後、保存されたファイルのサイズがディスク上で異なることがわかりました。

  • noProt:177.6MB
  • prot0:177.6MB
  • prot1:44.4MB
  • prot2:44.4MB

そんなこと知ってる prot0は人間が読めるテキストファイルなので、使用したくありません。プロトコル0はデフォルトで指定されたものだと思います。

プロトコル1と2の違いは何だろうかと思うのですが、なぜ選択する必要があるのでしょうか。

pickleまたはcPickleを使用する方が良いですか?

54
Cobry

Python 3を使用している場合、Python 3.5では、選択可能な5つのプロトコルがあります。

現在、酸洗いに使用できる5つの異なるプロトコルがあります。使用するプロトコルが高いほど、Python生成されたピクルスの読み取りに必要な最新バージョン[ doc ]:

  • プロトコルバージョン0は、元の「人間が読み取れる」プロトコルであり、以前のバージョンのPythonと下位互換性があります。

  • プロトコルバージョン1は、以前のバージョンのPythonと互換性のある古いバイナリ形式です。

  • プロトコルバージョン2は、Python 2.3で導入されました。新しいスタイルのクラスのピクルスをより効率的に提供します。プロトコル2によってもたらされた改善については、PEP 307を参照してください。
  • プロトコルバージョン3は、Python 3.0で追加されました。バイトオブジェクトを明示的にサポートしており、Python 2.x.これはデフォルトプロトコルです。他のPython 3バージョンとの互換性が必要な場合の推奨プロトコル。
  • プロトコルバージョン4は、Python 3.4で追加されました。非常に大きなオブジェクトのサポート、より多くの種類のオブジェクトのピクル、およびいくつかのデータ形式の最適化を追加します。プロトコル4によってもたらされる改善については、 。

一般的なルールは、使用したいものと下位互換性がある可能な限り最高のプロトコルを使用することです。したがって、Python 2と後方互換性が必要な場合、プロトコルバージョン2は、すべてのPython =バージョンの場合、バージョン1が適切です。下位互換性を気にしない場合は、pickle.HIGHEST_PROTOCOLは、Pythonバージョン。

また、Python 3)では、pickleをインポートすると、C実装が自動的にインポートされます。

互換性に関して注意すべきもう1つのポイントは、デフォルトではプロトコル3および4は文字列のUnicodeエンコードを使用しますが、以前のプロトコルは使用しないことです。 Python 3で、Python 2でピクルされたファイルをロードする場合、おそらくエンコーディングを明示的に指定してロードする必要があります。正しく。

17
patapouf_ai