2014-01-06 153 views
0

我正在一個項目中工作,一些過程需要很長時間才能完成(總共> 2小時),並且某些過程顯然可以並行化。一些例子是這些:並行處理 - Python

for n in range(images): 
    entry = ImD.ImageData(width, height) 
    entry.interpolate_points(seeds) 
    entries.append(entry) 

def interpolate_points(self, seeds): 
    points = [] 
    f = [] 
    for i in range(seeds): 
     # Generate a cell position 
     pos_x = random.randrange(self.width) 
     pos_y = random.randrange(self.height) 

     # Save the f(x,y) data 
     x = Utils.translate_range(pos_x, 0, self.width, self.range_min, self.range_max) 
     y = Utils.translate_range(pos_y, 0, self.height, self.range_min, self.range_max) 
     z = Utils.function(x, y) 
     points.append([x, y]) 

     f.append(z) 
    for x in range(self.width): 
     xt = (Utils.translate_range(x, 0, self.width, self.range_min, self.range_max)) 
     for y in range(self.height): 
      yt = (Utils.translate_range(y, 0, self.height, self.range_min, self.range_max)) 
      self.data[x][y] = Utils.shepard_euclidian(points, f, [xt, yt], 3) 

插值點方法需要將締結相關的時間,因爲我把它更多的則40倍,我相信我能有一些這方面的呼叫並行運行的。

def generate_pixel_histogram(self, images, bins): 
    """ 
    Generate a histogram of the image for each pixel, counting 
    the values assumed for each pixel in a specified bins 
    """ 
    max_value = 0.0 
    min_value = 0.0 
    for i in range(len(images)): 
     image = images[i] 
     max_entry = max(max(p[1:]) for p in image.data) 
     min_entry = min(min(p[1:]) for p in image.data) 
     if max_entry > max_value: 
      max_value = max_entry 
     if min_entry < min_value: 
      min_value = min_entry 

    interval_size = (math.fabs(min_value) + math.fabs(max_value))/bins 

    for x in range(self.width): 
     for y in range(self.height): 
      pixel_histogram = {} 
      for i in range(bins+1): 
       key = round(min_value+(i*interval_size), 2) 
       print key 
       pixel_histogram[key] = 0.0 
      for i in range(len(images)): 
       image = images[i] 
       value = round(Utils.get_bin(image.data[x][y], interval_size), 2) 
       pixel_histogram[value] += 1.0/len(images) 
      self.data[x][y] = pixel_histogram 

生成像素直方圖的方法是另一種情況。在這裏,我有多個圖像,並且對於圖像的每個位置,我必須生成一個直方圖。所以,每個位置都明顯獨立於其他位置,所以我認爲這是一個可以並行化的明顯情況。

問題是因爲我在Python,Cython等等看multiprocessing,但我沒有弄清楚如何應用這是我的代碼。我從來沒有在實踐中使用過多處理,所以我有一些難以將這個概念應用於我的問題。

我已經試過這樣:

p = Pool(5) 
for n in range(images): 
    entry = ImD.ImageData(width, height) 
    entries.append(entry) 

p.map(ImD.interpolate_points, entries) 

但它不工作,因爲我帶班工作。

任何幫助,將不勝感激。 在此先感謝。

回答

0

你可以嘗試多進程的並行映射。這是一種「排隊」模式,在這種模式中,您需要完成很多任務,您需要提出一些工作流程,然後才能對其進行處理。

http://docs.python.org/2/library/multiprocessing.html

一個例子(從該頁面獲取):

from multiprocessing import Pool 
p = Pool(5) 
def f(x): 
    return x*x 

p.map(f, range(50)) 

這將帶來5個工作流程,他們將採取他們的作品從你傳遞給映射列表。

請注意,沒有處理訂單保證。

+0

謝謝@geekazoid。這似乎適用於我的第一個問題(我會嘗試這個),但我想我應該爲第二個問題採用另一種方法。你我怎麼能平行第二個例子?非常感謝你。 – pceccon

+0

我並不清楚這個問題,但是假設這個問題存在兩倍。 您可以使用笛卡爾積將其轉換爲單個列表。 itertools.product爲您提供兩個迭代器(或列表)的笛卡爾積,並返回一個迭代器,而不是另一個長列表;) http://docs.python.org/2/library/itertools.html – geekazoid

+0

BTW如果您認爲這是一個解決方案,請將其標記爲如此。謝謝! – geekazoid