我有一張640x480圖片的numpy.array,每張圖片長630張。 總陣列因此是630x480x640。 我想要生成一幅平均圖像,並且計算所有630張圖像上每個像素的標準偏差 。Python多處理Pool.map正在調用aquire?
這是很容易
avg_image = numpy.mean(img_array, axis=0)
std_image = numpy.std(img_array, axis=0)
完成然而,因爲我跑這50個左右這樣的陣列,並有 8核/ 16線程工作站,我想我會得到貪婪使用 multiprocessing.Pool並行化。
所以我做了以下內容:
def chunk_avg_map(chunk):
#do the processing
sig_avg = numpy.mean(chunk, axis=0)
sig_std = numpy.std(chunk, axis=0)
return([sig_avg, sig_std])
def chunk_avg(img_data):
#take each row of the image
chunks = [img_data[:,i,:] for i in range(len(img_data[0]))]
pool = multiprocessing.Pool()
result = pool.map(chunk_avg_map, chunks)
pool.close()
pool.join()
return result
但是,我看到的只是一個小的加速。通過將打印語句放在chunk_avg_map中,我可以確定一次只能啓動一個或兩個進程,而不是我所期望的那樣。
然後,我跑到通過CPROFILE我的代碼在IPython中:
%prun current_image_anal.main()
結果表明,目前大部分時間在電話都花在收購:
ncalls tottime percall cumtime percall filename:lineno(function)
1527 309.755 0.203 309.755 0.203 {built-in method acquire}
我的理解是什麼與鎖定有關,但我不明白爲什麼我的代碼會這樣做。有沒有人有任何想法?
[編輯]根據要求,這是一個可運行的腳本,它演示了這個問題。 你可以通過任何你喜歡的方式來分析它,但是當我發現獅子 份額的時間已被調用獲取,而不是像我想 預期的那樣。
#!/usr/bin/python
import numpy
import multiprocessing
def main():
fake_images = numpy.random.randint(0,2**14,(630,480,640))
chunk_avg(fake_images)
def chunk_avg_map(chunk):
#do the processing
sig_avg = numpy.mean(chunk, axis=0)
sig_std = numpy.std(chunk, axis=0)
return([sig_avg, sig_std])
def chunk_avg(img_data):
#take each row of the image
chunks = [img_data[:,i,:] for i in range(len(img_data[0]))]
pool = multiprocessing.Pool()
result = pool.map(chunk_avg_map, chunks)
pool.close()
pool.join()
return result
if __name__ == "__main__":
main()
什麼給你multiprocessing.cpu_count()?如預期的那樣, – 2010-09-22 17:26:05
multiprocessing.cpu_count()產生16。 – 2010-09-22 17:48:04
這可能沒關係,但是'chunk_avg(im_data)'是'chunk_avg(img_data)'? – unutbu 2010-09-22 17:58:06