Python:为什么多处理器应用线程而不是多处理器?

2024-05-19 02:50:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用遗传算法的inspyred库。我有以下配置:

def distance(route, distances):
    totalDistance = 0

    for idx, customer in enumerate(route):
        if (idx < len(route) - 1):
            distance = distances[customer][route[idx + 1]]
            totalDistance += distance

    return totalDistance


def evaluator(candidates, args):

    data = args['data']
    distances = data.distances

    fitness = []

    for candidate in candidates:
        tot_distance = 0
        for index, route in enumerate(candidate):
            tot_distance += distance(route, distances)

        fitness.append(tot_distance)

    return fitness

def main(debugMode):
  start = default_timer()

  data = DataProblem(debugMode)

  prng = Random()
  prng.seed(time())

  problem = inspyred.benchmarks.TSP(data.distances)
  ea = inspyred.ec.EvolutionaryComputation(prng)
  ea.selector = inspyred.ec.selectors.tournament_selection
  ea.variator = [custom_partially_matched_crossover, custom_inversion_mutation]
  ea.replacer = inspyred.ec.replacers.generational_replacement
  ea.terminator = inspyred.ec.terminators.generation_termination
  final_pop = ea.evolve(generator=generator,
                        bounder=problem.bounder,
                        maximize=False,
                        evaluator=inspyred.ec.evaluators.parallel_evaluation_mp,
                        mp_evaluator=evaluator, 
                        pop_size=100,
                        data=data,
                        max_generations=100000,
                        tournament_size=5,
                        num_selected=100,
                        num_elites=1)

  best = max(ea.population)
  print('Best Solution: {0}: {1}'.format(str(best.candidate), best.fitness))
  duration = default_timer() - start
  print(duration / 60)
  return ea


if __name__ == '__main__':

  try:
    fileLocation = sys.argv[1]
    timeOfDay = sys.argv[2]
    debugMode = False
  except:
    debugMode = True
    timeOfDay = 'morning'

  main(debugMode)

mp\ U evaluator启用多处理,并使用以下方法:

def parallel_evaluation_mp(candidates, args):

    import time
    import multiprocessing

    nprocs = multiprocessing.cpu_count()

    start = time.time()
    try:
        pool = multiprocessing.Pool(processes=nprocs)
        results = [pool.apply_async(evaluator, ([c], pickled_args)) for c in candidates]
        pool.close()
        pool.join()
        return [r.get()[0] for r in results]
    except (OSError, RuntimeError) as e:
        logger.error('failed parallel_evaluation_mp: {0}'.format(str(e)))
        raise
    else:
        end = time.time()
        logger.debug('completed parallel_evaluation_mp in {0} seconds'.format(end - start))

然而,当我查看我的活动监视器时,我只看到约85%的1个处理器与4个线程一起使用。在没有启用多处理器的情况下,代码在一个处理器上的执行速度实际上更快。你知道吗

但是为什么在四核机器上使用4个线程而不是4个处理器呢?你知道吗


Tags: infordatareturntimeevaluatordefmp

热门问题