2013-05-30 3 views
13

現在、私はPythonで画像を取得しています。この例の画像から抽出されたキーポイントおよび記述子は、numpy.arrayで表されます。 shape(2000、5)とshape(2000,128)の後者の最初のもの。両方ともdtype=numpy.float32の値だけを含んでいます。数値データのcickleよりもpickleの方が速いですか?

私は、抽出されたキーポイントとディスクリプタを保存するために使用するフォーマットが不思議でした。私。私はいつも2つのファイルを保存しています:1つはキーポイント用、もう1つはディスクリプタ用です - これは私の測定では1つのステップとしてカウントされます。私はいつもcPicklepickleモジュールよりも速いことになって考え

enter image description here

:私はとnumpyののバイナリフォーマット.pny、結果は本当に私を混乱されている(プロトコル0と2の両方)picklecPickleを比較しました。しかし、特にプロトコル0のロード時間は実際に結果に突き当たります。 誰もこれについて説明していますか?私は数値データのみを使用しているのですか?奇妙な...

PSのようだ:私のコードでは、私は基本的に各技術より1000倍(number=1000)をループだし、最後に計測した時間を平均:

timer = time.time 

    print 'npy save...' 
    t0 = timer() 
    for i in range(number): 
     numpy.save(npy_kp_path, kp) 
     numpy.save(npy_descr_path, descr) 
    t1 = timer() 
    results['npy']['save'] = t1 - t0 

    print 'npy load...' 
    t0 = timer() 
    for i in range(number): 
     kp = numpy.load(npy_kp_path) 
     descr = numpy.load(npy_descr_path) 
    t1 = timer() 
    results['npy']['load'] = t1 - t0 


    print 'pickle protocol 0 save...' 
    t0 = timer() 
    for i in range(number): 
     with open(pkl0_descr_path, 'wb') as f: 
      pickle.dump(descr, f, protocol=0) 
     with open(pkl0_kp_path, 'wb') as f: 
      pickle.dump(kp, f, protocol=0) 
    t1 = timer() 
    results['pkl0']['save'] = t1 - t0 

    print 'pickle protocol 0 load...' 
    t0 = timer() 
    for i in range(number): 
     with open(pkl0_descr_path, 'rb') as f: 
      descr = pickle.load(f) 
     with open(pkl0_kp_path, 'rb') as f: 
      kp = pickle.load(f) 
    t1 = timer() 
    results['pkl0']['load'] = t1 - t0 


    print 'cPickle protocol 0 save...' 
    t0 = timer() 
    for i in range(number): 
     with open(cpkl0_descr_path, 'wb') as f: 
      cPickle.dump(descr, f, protocol=0) 
     with open(cpkl0_kp_path, 'wb') as f: 
      cPickle.dump(kp, f, protocol=0) 
    t1 = timer() 
    results['cpkl0']['save'] = t1 - t0 

    print 'cPickle protocol 0 load...' 
    t0 = timer() 
    for i in range(number): 
     with open(cpkl0_descr_path, 'rb') as f: 
      descr = cPickle.load(f) 
     with open(cpkl0_kp_path, 'rb') as f: 
      kp = cPickle.load(f) 
    t1 = timer() 
    results['cpkl0']['load'] = t1 - t0 


    print 'pickle highest protocol (2) save...' 
    t0 = timer() 
    for i in range(number): 
     with open(pkl2_descr_path, 'wb') as f: 
      pickle.dump(descr, f, protocol=pickle.HIGHEST_PROTOCOL) 
     with open(pkl2_kp_path, 'wb') as f: 
      pickle.dump(kp, f, protocol=pickle.HIGHEST_PROTOCOL) 
    t1 = timer() 
    results['pkl2']['save'] = t1 - t0 

    print 'pickle highest protocol (2) load...' 
    t0 = timer() 
    for i in range(number): 
     with open(pkl2_descr_path, 'rb') as f: 
      descr = pickle.load(f) 
     with open(pkl2_kp_path, 'rb') as f: 
      kp = pickle.load(f) 
    t1 = timer() 
    results['pkl2']['load'] = t1 - t0 


    print 'cPickle highest protocol (2) save...' 
    t0 = timer() 
    for i in range(number): 
     with open(cpkl2_descr_path, 'wb') as f: 
      cPickle.dump(descr, f, protocol=cPickle.HIGHEST_PROTOCOL) 
     with open(cpkl2_kp_path, 'wb') as f: 
      cPickle.dump(kp, f, protocol=cPickle.HIGHEST_PROTOCOL) 
    t1 = timer() 
    results['cpkl2']['save'] = t1 - t0 

    print 'cPickle highest protocol (2) load...' 
    t0 = timer() 
    for i in range(number): 
     with open(cpkl2_descr_path, 'rb') as f: 
      descr = cPickle.load(f) 
     with open(cpkl2_kp_path, 'rb') as f: 
      kp = cPickle.load(f) 
    t1 = timer() 
    results['cpkl2']['load'] = t1 - t0 
+0

私は今この自分自身に気付き、あなたの質問を見つけました。私は少なくとも大小の違いがあります。 pickleはcpickleよりもはるかに高速です。 –

答えて

6

(のバイナリ表現) ndarrayの数値データを1つの長い文字列としてピックします。プロトコル0のファイルから大きな文字列をアンピクルすると、cPickleは実際にはpickleよりはるかに遅いようです。どうして?私の推測では、pickleは標準ライブラリのよくチューニングされた文字列アルゴリズムを使用しており、cPickleはそれを下回っています。

上記の観察はPython 2.7で行ったものです。自動的にC拡張を使うPython 3.3はPython 2.7のいずれのモジュールよりも速いので、明らかに問題は修正されています。

+0

Python 3.3で解決策を指摘してくれてありがとう。私の例では、ideed 2.7を使用しています。チェックアウトします3.3 – pklip

+0

@pklipしかし、なぜあなたはプロトコル0の使用を主張するのですか?プロトコル2はあなたのタイミングに応じて速いです。 –

+0

もちろん、私は "テキスト読み込み可能"ファイルは必要ないので、プロトコル2を使用します。私は一般的に3.3を試してみたいと思っていました:) – pklip

関連する問題