2015-04-12 18 views
0

我試圖加快在python採用並行處理我的代碼段,但我無法得到它的工作權利,甚至發現有與我有關的例子。並行化圖像處理使用numpy的

的代碼產生使用Delaunay三角剖分的圖像的低多邊形版本,而這減慢我下來是找到每個三角形的平均值的部分。

我已經能夠獲得通過矢量化我的代碼一個很好的速度增加,但希望能得到更多的使用並行化:

的代碼我無法用是循環的非常簡單:

for tri in tris: 
     lopo[tridex==tri,:] = np.mean(hipo[tridex==tri,:],axis=0) 

引用的變量如下。

tris - 三角形的所有索引的獨特蟒蛇名單

lopo - 原始圖像

的numpy的陣列 - 的最終低多邊形版本的圖像。

hipo一個numpy的陣列

tridex - 與圖像大小相同的Numpy數組。每個元素表示的像素,並存儲該像素位於內

我似乎無法找到使用多個numpy的數組作爲輸入,具有共享它們中的一個很好的例子的三角形。

我試着多(與上面的代碼片段包裹在一種叫做colorImage功能):

p = Process(target=colorImage, args=(hipo,lopo,tridex,ppTris)) 
p.start() 
p.join() 

但我立即得到一個破碎的管道錯誤。

回答

0

這樣的方式,Python的多作品(大部分)是,你必須指定你要運行的單個線程。我在這裏做了一個簡短的介紹性教程:http://will-farmer.com/parallel-python.html

在你的情況下,我建議將tris分成許多不同的部分,每個部分大小相同,每個代表一個「工作人員」。您可以將此列表與numpy.split()(文檔在這裏:http://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html)分開。

然後在三每個列表中,我們使用線程和隊列模塊指定8名工人。

import numpy as np 
# split into 8 different lists 
tri_lists = np.split(tris, 8) 
# Queues are threadsafe 
return_values = queue.Queue() 
threads = [] 
def color_image(q, tris, hipo, tridex): 
    """ This is the function we're parallelizing """ 
    for tri in tris: 
     return_values.put(np.mean(hipo[tridex==tri,:], axis=0)) 
# Now we run the jobs 
for i in range(8): 
    threads.append(threading.Thread(
     target=color_image, 
     args=(return_values, tri_lists[i], hipo, tridex))) 
# Now we have to cleanup our results 
# First get items from queue 
results = [item for item in return_values.queue] 
# Now set values in lopo 
for i in range(len(results)): 
    for t in tri_lists[i]: 
     lopo[tridex==t, :] = results[i] 

這不是做最徹底的方法,我不知道,如果它的作品,因爲我無法測試它,但這是做一個體面的方式。並行化部分現在爲np.mean(),而設置值不是並行化的。

如果你也想並行化值的設置,你必須有一個共享變量,或者使用隊列,或用全局變量。

看到這個職位的一個共享的全局變量:Python Global Variable with thread

+0

是否線程不允許設置新值?我還沒有完全檢查,但我確實相信線程不會嘗試寫入相同的像素。在同一時間做平均計算和寫作應該會使我希望看到的大幅提速。 – Bill

+0

這也會起作用,但我從來沒有在線程上使用共享變量。只要你只是設置像素,你應該沒問題。是的,這也會給你一個更大的加速。看到我爲示例提供的SO鏈接。 – Will

+0

我似乎無法並行運行簡單的函數。你知道爲什麼一個腳本(在IDLE中運行)可以串行運行,甚至在使用並行模塊時也是如此?我的電腦上可能有一些限制IDLE可以使用多少線程的設置? – Bill