使用类/返回列表进行多处理-Python
我正在尝试并行化我为随机生成一些图像而编写的代码(针对我正在处理的一个特定问题)。当我使用类时,我发现这对于多进程方法来说并不简单,我寻找了一些替代方法,发现了这种方法:使用类/返回列表进行多处理-Python,python,list,class,return,multiprocessing,Python,List,Class,Return,Multiprocessing,我正在尝试并行化我为随机生成一些图像而编写的代码(针对我正在处理的一个特定问题)。当我使用类时,我发现这对于多进程方法来说并不简单,我寻找了一些替代方法,发现了这种方法: #https://gist.github.com/fiatmoney/1086393 #MultiprocessingMethods.py def _pickle_method(method): func_name = method.im_func.__name__ obj = method.im_self
#https://gist.github.com/fiatmoney/1086393
#MultiprocessingMethods.py
def _pickle_method(method):
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
if func_name.startswith('__') and not func_name.endswith('__'): #deal with mangled names
cls_name = cls.__name__.lstrip('_')
func_name = '_' + cls_name + func_name
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.__mro__:
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
因此,我将此应用于我的代码:
from multiprocessing import Pool
from PIL import Image
import MultiprocessingMethods as Mp
import Utils
import random
import pylab as plt
import copy_reg
import types
copy_reg.pickle(types.MethodType, Mp._pickle_method, Mp._unpickle_method)
class ImageData(object):
def __init__(self, width, height, range_min=-1, range_max=1):
self.width = width
self.height = height
#The values range each pixel can assume
self.range_min = range_min
self.range_max = range_max
self.data = []
for i in range(width):
self.data.append([0] * height)
def generate_heat_map_image(self, name):
"""
Generate a heat map of the image
:param name: the name of the file
"""
#self.normalize_image_data()
plt.figure()
fig = plt.imshow(self.data, extent=[-1, 1, -1, 1])
plt.colorbar(fig)
plt.savefig(name+".png")
plt.close()
def shepard_interpolation(self, seeds=10):
print type (self.data)
#Code omitted 'cause it doesn't effect the problem
return self.data
if __name__ == '__main__':
x = [ImageData(50, 50), ImageData(50, 50)]
p = Pool()
outputs = p.map(ImageData.shepard_interpolation,x)
#A [[[ ]]]
print outputs
for i in range(len(outputs)):
# A [[ ]]
print outputs[i]
outputs[i].generate_heat_map_image("ImagesOutput/Entries/Entry"+str(i))
现在我可以并行化我的进程,但是我得到一个数组作为输出,我不知道为什么。在此之前,我总是得到一个ImageData数组,我可以用
matplotlib。这种返回是否与多处理有关?我想是的,因为我得到的是“AttributeError:'list'对象没有“generate_heat_map_image”属性,返回的应该是ImageData类型的列表,也不是列表的列表。我可以返回一个ImageData数组吗
任何帮助都将不胜感激。
提前感谢。ImageData类标识错误,因此您的方法实际上不属于该类,即使没有多重处理;这是正确的一个:
class ImageData:
def __init__(self, width, height, range_min=-1, range_max=1):
self.width = width
self.height = height
#Which values each pixel can assume
self.range_min = range_min
self.range_max = range_max
self.data = []
for i in range(width):
self.data.append([0] * height)
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)
# >>>> Note the identation change here!
def generate_heat_map_image(self, name):
"""
Generate a heat map of the image
:param name: the name of the file
"""
#self.normalize_image_data()
plt.figure()
fig = plt.imshow(self.data, extent=[-1, 1, -1, 1])
plt.colorbar(fig)
plt.savefig(name+".png")
plt.close()
解决了。我只是想说:
def shepard_interpolation(self, seeds=10):
print type (self.data)
#Code omitted 'cause it doesn't effect the problem
return self
在连续5个小时的编程之后发生的事情。
谢谢大家。在我的代码中缩进是可以的。当我粘贴它时,这是一个问题。我会编辑。你会遇到什么样的错误/异常?你能发布堆栈跟踪吗?我发现用Python应用多处理并不简单。我找到了另一个选择,但我仍然有问题。我会更新我的问题。谢谢你,@F.X。