我正在一個項目中工作,一些過程需要很長時間才能完成(總共> 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)
但它不工作,因爲我帶班工作。
任何幫助,將不勝感激。 在此先感謝。
謝謝@geekazoid。這似乎適用於我的第一個問題(我會嘗試這個),但我想我應該爲第二個問題採用另一種方法。你我怎麼能平行第二個例子?非常感謝你。 – pceccon
我並不清楚這個問題,但是假設這個問題存在兩倍。 您可以使用笛卡爾積將其轉換爲單個列表。 itertools.product爲您提供兩個迭代器(或列表)的笛卡爾積,並返回一個迭代器,而不是另一個長列表;) http://docs.python.org/2/library/itertools.html – geekazoid
BTW如果您認爲這是一個解決方案,請將其標記爲如此。謝謝! – geekazoid