2

Я видел ссылку here и пытался использовать метод для цикла for for, но, похоже, он работает не так, как ожидалось.Почему производительность многопроцессорности невидима?

def concatMessage(obj_grab, content): 
    for logCatcher in obj_grab: 
     for key in logCatcher.dic_map: 
      regex = re.compile(key) 
      for j in range(len(content)): 
       for m in re.finditer(regex, content[j]): 
        content[j] += "   " + logCatcher.index + "  " + logCatcher.dic_map[key] 
    return content 

def transferConcat(args): 
    return concatMessage(*args) 

if __name__ == "__name__": 
    pool = Pool() 
    content = pool.map(transferConcat, [(obj_grab, content)])[0] 
    pool.close() 
    pool.join() 

Я хочу повысить производительность цикла, потому что требуется 22 секунды для запуска.

Когда я запускаю метод напрямую, это также занимает около 22 секунд.

Кажется, что усовершенствование не удалось.

Что мне делать, чтобы увеличить скорость моего цикла? Почему pool.map не работает в моем случае?


После напоминают по nablahero, я пересмотрел свой код, как показано ниже:

if __name__ == "__main__": 
    content = input_file(target).split("\n") 
    content = manager.list(content) 
    for files in source: 
     obj_grab.append((LogCatcher(files), content)) 
    pool = Pool() 
    pool.map(transferConcat, obj_grab) 
    pool.close() 
    pool.join() 

def concatMessage(LogCatcher, content): 
    for key in LogCatcher.dic_map: 
     regex = re.compile(key) 
     for j in range(len(content)): 
      for m in re.finditer(regex, content[j]): 
       content[j] += LogCatcher.index + LogCatcher.dic_map[key] 

def transferConcat(args): 
    return concatMessage(*args) 

после долгого ожидания, это вызвало 82 секунд, чтобы закончить ...

Почему я получил эту ситуацию? Как я могу пересмотреть свой код?


obj_grab список, который содержит logCatchers из другого файла intput содержания является файлом я хочу Concat, а также использовать менеджер(), чтобы позволить многопроцессному Concat того же файл.

+0

Что значит «исполнение невидимо»? Какая производительность видима? – number5

+0

несвязанный, но вы можете перебирать содержимое вместо индексации –

+0

Этот примерный код будет * медленнее *, чем эквивалентный последовательный код. Все, что вы делаете, это запуск одной функции в дочернем процессе и ее завершение. Стоимость IPC для отправки функции и ее аргументов дочернему процессу сделает ее медленнее, чем если бы вы просто запускали ее все в родительском. 'Pool.map' полезен только тогда, когда вы используете его для параллельной работы многих функций. – dano

ответ

2

Что находится в obj_grab и содержимом? Я предполагаю, что он содержит только один объект, поэтому, когда вы запускаете свой пул, вы вызываете функцию transferConcat только один раз, потому что у вас есть только один объект в obj_grab и контент.

Если вы используете карту, взгляните на свою ссылку еще раз. obj_grab и контент должны быть списками объектов, чтобы ускорить вашу программу, потому что она вызывает функцию несколько раз с разными obj_grab и содержимым.

pool.map не ускоряет выполнение самой функции - функция просто вызывается несколько раз параллельно с разными данными!

Я надеюсь, что это очистит некоторые вещи.

Смежные вопросы