【问题标题】:How to reuse workers from Pool for a genetic algorithm如何重用 Pool 中的工人进行遗传算法
【发布时间】:2016-11-07 10:24:22
【问题描述】:

我之前有一个关于这个问题的相关问题:Parallelize for loop in python

我有一个遗传算法,我试图通过并行化评估函数来加速它。 GA 是一个类,代码如下所示:

copy_reg.pickle(types.MethodType,lambda method: (getattr, (method.im_self, method.im_func.__name__)),getattr) 

class GA:

    ...
    ...

    def evaluation(self):
        self.scores = Pool(processes=nprocs).map(self.costly_function,self.population)

    def run(self):
        self.initial_population()
        self.evaluation()
        while self.Gen > i:
            self.select()
            self.crossover()
            self.mutation()
            self.evaluation()
            i += 1

与顺序方法相比,这给出了正确的结果,但速度要慢得多。我的猜测是,这是因为我在函数evaluation 的while 循环内为每一代创建了一组新的进程工作者。有没有办法重用工人,这样我就可以提高速度?

【问题讨论】:

  • nprocs 设置为什么? self.costly_function 在 CPU、内存、IO 或其他方面是否“昂贵”?
  • 设置为4,costly_function在CPU方面的开销很大。

标签: python python-2.7 parallel-processing genetic-algorithm python-multiprocessing


【解决方案1】:

通过添加下面我从https://stackoverflow.com/a/25385582/4759898得到的函数解决了这个问题

def __getstate__(self):
    self_dict = self.__dict__.copy()
    del self_dict['pool']
    return self_dict

def __setstate__(self, state):
    self.__dict__.update(state)

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多