2013-05-30 19 views
13

Şu anda Python ile görüntü alımı üzerinde çalışıyorum. Bu örnekte bir görüntüden çıkarılan anahtar noktaları ve tanımlayıcılar numpy.array s olarak temsil edilir. Şeklin birincisi (2000, 5) ve şeklin ikincisi (2000, 128). Her ikisi de sadece dtype=numpy.float32 değerlerini içerir.nümerik verilerden cPickle'den daha hızlı mı?

Ayıklanmış anahtar noktalarımı ve tanımlayıcılarımı kaydetmek için hangi biçimi kullanacağımı merak ettim. Yani Her zaman 2 dosya kaydediyorum: biri anahtar noktaları için ve tanımlayıcılar için bir tane - bu benim ölçümlerimde bir adım olarak sayılır. Ben pickle, cPickle karşılaştırıldığında (hem protokol 0 ve 2 ile) ve numpy ikili formatta .pny ve sonuçları gerçekten kafamı karıştırıyorsun:

enter image description here

Hep cPicklepickle modülün daha hızlı olması gerekiyordu düşündüm. Ancak özellikle protokol 0 ile yükleme süresi gerçekten sonuçlara yapışıyor. Bunun için herhangi bir açıklaması var mı? Sadece sayısal verileri kullanıyorum diye mi? Garip ...

PS görünüyor: Benim kodda temelde her tekniğin üzerinde 1000 kez (number=1000) döngü ediyorum ve sonunda ölçülen zaman ortalama:

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

Bugün bunu kendim fark ettim ve sorunuzu buldum, en azından bir büyüklük farkı sırası aldım. turşu, cpickle'dan kesinlikle daha hızlıdır. –

cevap

6

(ikili gösterimi) Bir ndarray nolu sayısal veri, bir uzun dizge olarak seçilmektedir. cPickle'un pickle'dan çok daha büyük olduğunu ve protokol 0 dosyalarından büyük dizeleri çıkardığını görüyoruz. Niye ya? Benim tahminim, pickle'un standart kütüphaneden iyi ayarlanmış dize algoritmalarını kullanması ve cPickle'un geride kalmasıdır.

Yukarıdaki gözlem Python 2.7 ile oynamaktan geçer. Bir C uzantısını otomatik olarak kullanan Python 3.3, Python 2.7'deki modülden daha hızlıdır, bu nedenle sorun düzeltildi.

+0

Python 3.3 ile çözümü işaretlediğiniz için teşekkür ederiz. Örneğimde ideed 2.7 kullanılıyor. Check out out 3.3 – pklip

+0

@pklip Peki neden protokol 0'ı kullanmakta ısrar etmelisiniz? Protokol 2, zamanlamalarınıza göre hızlıdır. –

+0

Tabii ki, "textually read" dosyasına ihtiyaç duymayacağım için protokol 2'yi kullanacağım. Genel olarak 3.3'ü denemek merak ettim ve merak ettim :) – pklip

İlgili konular