0

我有一个包含对象列表的对象。我想做类似的事情:

def compute_weight(particle, data):
    particle.weight = run_computation(data)

class SomeClass:
    def __init__(self):
        self.particles = [obj1, obj2, etc]

    def run(self, data):
        [compute_weight(particle, data) for p in self.particles]

这些可以独立运行,但我需要 self.particles 来包含每个更新的粒子。目前,我有一个技巧可以将两个参数推入 pool.map 函数

            # equivalent function as above
            pool.map(compute_weight_star, itertools.izip(self.particles,
                                                         itertools.repeat(data)))

但是每个particle.weight 似乎都没有更新。我究竟做错了什么?

4

1 回答 1

0

问题是粒子对象在工作进程中得到更新,但它们被传回主进程。考虑以下简化示例:

from multiprocessing import Pool

particles = [[0], [0], [0]]

def compute_weight(particle):
    particle[0] = 1

if __name__ == '__main__':
    Pool().map(compute_weight, particles)
    print(particles)

您会发现这使粒子权重(列表的第一个元素)为 0,而它们应该为 1。

解决方案是在工作进程中计算粒子权重,但在主进程中进行存储部分:

def compute_weight(particle):
    return 1

if __name__ == '__main__':
    w = Pool().map(compute_weight, particles)
    for i, p in enumerate(particles):
        p[0] = w[i]     # set weight
    print(particles)
于 2012-10-03T20:28:19.220 回答