Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并行处理-Python_Python_Multithreading_Multiprocessing - Fatal编程技术网

并行处理-Python

并行处理-Python,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我在一个项目中工作,其中一些过程需要很长时间才能完成(总时间>2小时),而且一些过程显然可以并行化。例如: for n in range(images): entry = ImD.ImageData(width, height) entry.interpolate_points(seeds) entries.append(entry) def interpolate_points(self, seeds): points = [] f = []

我在一个项目中工作,其中一些过程需要很长时间才能完成(总时间>2小时),而且一些过程显然可以并行化。例如:

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
但它不起作用,因为我是和班级一起工作的

任何帮助都将不胜感激。
提前感谢。

您可以从多进程中尝试并行映射。这是一种“队列”模型,在这种模型中,你要做大量的任务,你要提出一些工作流程,他们要处理这些流程

示例(取自该页):

这将带来5个工作流程,他们将从您传递给map的列表中获取他们的工作


请注意,不保证处理订单。

谢谢@geekazoid。这似乎适用于我的第一个问题(我将尝试这个),但我想我应该使用另一种方法来解决第二个问题。你知道我如何将第二个例子并行化吗?非常感谢。我不太明白这个问题,但是假设那个双人房间有问题。您可以使用笛卡尔乘积将双for转换为单个列表。itertools.product提供两个迭代器(或列表)的笛卡尔乘积,并返回一个迭代器,而不是另一个长列表;)我不知道如何用你的例子来解决我的问题。我有三行代码必须为一个实例执行。在使用您的示例@geekazoid?@pceccon之前,我必须为它创建一个方法。很抱歉,延迟了。是的,您必须创建一个单独的函数。告诉我你能不能做到。是的,我做到了。但不知何故,它比没有多重处理要慢得多!面向对象
p = Pool(5)
for n in range(images):
    entry = ImD.ImageData(width, height)
    entries.append(entry)

p.map(ImD.interpolate_points, entries)
from multiprocessing import Pool
p = Pool(5)
def f(x):
    return x*x

p.map(f, range(50))