Ş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:
Hep cPickle
pickle
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
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. –