Как использовать многопроцессорность, чтобы получить наибольшее значение? - PullRequest
0 голосов
/ 02 мая 2020

Я пишу программу, которая должна проработать около 1000 кандидатов и найти лучший результат. Мне нужно использовать многопроцессорность для работы со списком, потому что это будет сделано примерно 60000 раз. Как бы мы использовали многопроцессорность в этой ситуации. Скажем, что счет рассчитывается так:

def get_score(a, b):
    return (a * b) / (a + b)

Я знаю a в каждом случае, но он меняется каждый раз, когда вы go просматриваете список кандидатов, потому что он добавляет лучшего кандидата в список. Я хочу, чтобы он перебрал список кандидатов, а затем нашел лучший результат. Пример, не относящийся к многопроцессорной обработке, выглядит следующим образом:

s = [random.randint(0, 100)]
candidates = [random.randint(0, 100) for i in range(1000)]  

for i in range(60000):
    best_score = 0
    best_candidate = candidates[0]
    for j in candidates:
        if get_score(s[-1], j) > best_score:  
            best_candidate = j
            best_score = get_score(s[-1], j)
    s.append(best_candidate)

Я знаю, что могу создать функцию, но мне кажется, что есть более простой способ сделать это. Извините за вопрос новичка. :/

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

В вашем коде много несоответствий, таких как отсутствие обновления best_score и сравнение с лучшим значением, оцененным 0.

Ваш вложенный дизайн на основе l oop затрудняет процесс паррализирования решения, вы также не предоставил более подробную информацию, например действительно ли порядок имеет значение?

Я даю фиктивное многопроцессорное решение, которое запускает диапазон 60000 l oop в n-процессор в параллельно, и записывает эти решения в numpy массивов. Однако вам решать, как вы будете объединять решение.

import random
import numpy as np
import multiprocessing as mp

s = [random.randint(0, 100)]
candidates = [random.randint(0, 100) for i in range(1000)]  

n_cpu = mp.cpu_count()


def get_score(a, b):
    return (a * b) / (a + b)



def partial_gen(num_segment):
  part_arr = []
  for i in range(60000//n_cpu): # breaking the loop into n_cpu segments
      best_score = 0
      best_candidate = candidates[0]
      for j in candidates:
          new_score = get_score(s[-1], j)
          if new_score > best_score:  
              best_candidate = j
              best_score = new_score # are you sure? you don't wanna update this?
      part_arr.append(best_candidate)
  part_arr = np.array(part_arr)
  np.save(f'{num_segment}.npy', part_arr)

p = mp.Pool(n_cpu)
p.map(partial_gen, range(n_cpu))
0 голосов
/ 02 мая 2020

Один простой способ ускорить процесс - использовать векторизация (в качестве первого шага оптимизации, а не многопроцессорной обработки). Вы можете достичь этого, используя numpy ndarrays .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...