python应用实例论文_番外篇——Python多进程应用实例一则
前言:
現在的電腦普遍進入多核時代,當我們需要做一些計算密集型任務時,運用并行計算能夠發揮CPU的性能,也夠大大的節省我們的時間。在現在的數據挖掘中,Python是一門非常強大的語言,語法直接明了,易于上手。今天我們就用Python的Multiprocessing庫來做個簡單的應用實例分析。
1. 簡單的背景介紹
1.1 數據處理目標
首先筆者有很多的圖像數據需要處理,例如Fig.1 所示。數據處理目標是獲取背景面板上水位數據,采用的方法是OpenCV的。篇幅有限(筆者太懶),本文就不介紹具體的實現過程,在代碼中封裝為img_processing 函數,輸入參數為文件名,輸出為水位及相關的時間戳等數據。
Fig. 1 原始圖片實例
1.2 Multiprocessing的實現方法
由于筆者有較多的數據,約32000張圖片,數據處理時間較長。同時鑒于筆者的工作電腦CPU為8核,內存為32GB,筆者計劃采用多進程的方法來加速計算。在本文中主要用到了Multiprocessing的Pool方法,具體的介紹可見多進程-廖雪峰的官方網站。
另外,為了測試與比較不同CPU核數的工作效率,筆者將多進程方法封裝為multiProcessingTest函數,輸入參數為CPU核數與圖片文件數量,輸出為對應的代碼工作時間。詳細代碼如下所示:
def multiProcessingTest(coreNum,filenameList):
# 測試不同CPU核數和圖片數量下的消耗時間。
# cores from 1 to 8
# 圖片數量: selected numbers range from 1 to 30000. start_time = time.time()
p = Pool(coreNum) # cores from 1 to 8
results = p.map(img_processing, filenameList)
p.close()
p.join()
callapsTime = time.time() - start_time
return callapsTime
2. 結果與分析
Fig. 2 展示了不同圖片文件數量下,不同CPU核數的計算消耗時間。由圖可見,隨著文件數量的增加,單核(即Core 1)消耗的時間劇烈增加:1000圖片時,消耗時間在10s以內;到50,000圖片時,時間增加到187s;300,000圖片時,消耗時間長達5300.2s,約1.47小時。
Fig. 2 Collapsed time at different cores and file sizes
如果我們采用多核并行計算,消耗時間大大減少。Fig. 1 可以看出多核計算時面積明顯小于單核計算的面積,并且CPU核數越多,消耗的時間越少。例如,當我們有100,000圖片文件時,單核計算需要403.4s,雙核需要268.7s,4核需要158.4s,而8核僅需100.8s。
通過計算8核消耗時間與單核時間的百分比,見圖3, 我們發現一個有趣的現象。大量數據時,例如30,000個文件,8核消耗的時間僅占單核的5.2%,即8核能夠節省至少94%的計算時間。但是,當文件數量較少時,例如1000個圖片文件,8核反而消耗了更多的時間。這個是因為系統將任務分配也需要一定的資源,當文件數量較少時,分配任務的時間占比重較大,反而真正計算的時間相對較少,所以CPU核數多消耗的時間更多。因此,我們也能得出結論,并不是CPU越多效率越高。
Fig. 3 Percentile of collpased time of 8 cores over 1 core at different image file sizes
如果并不是CPU核數越多效率越高,那么在大量圖片文件時,多少CPU的效率最高呢?我們同樣可以計算, 在300,000個文件下,平均每個CPU核數的速度(file processing per second per core),如Fig.4 所示。我們可以看出在雙核時單個CPU的效率最高,隨著CPU核數的增多,速度稍有降低。個人猜測,由于系統分配任務消耗的資源隨CPU核數的增加而增加,當核數較多時,分配任務消耗的資源更大,某種程度上拖慢了CPU的工作效率。但是,需要注意的是,核數較多時,整體速度還是更快的,消耗的資源也更多。如何取舍效率與速度,需要讀者朋友們自己斟酌了。
Fig. 4 Image processing speed per CPU core
3. Take-home pointsPython 可以用簡單的代碼引入多進程計算,大大降低計算密集型算法消耗的時間;
核數越多并不代表速度越快,數據量的大小是重要的參考因素;
在大量數據背景下,雙核效率最高,核數越多速度越快,效率與速度的抉擇需要讀者自己取舍。
Thanks for reading.
PS:筆者為Python愛好者,對Python了解并沒有特別深入,如有不足之處,歡迎指出,敬請諒解。
總結
以上是生活随笔為你收集整理的python应用实例论文_番外篇——Python多进程应用实例一则的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 长情不及久伴下一句是什么啊?
 - 下一篇: 花火杂志封面是谁画的啊?