Почему в многопроцессорной обработке добавить список медленнее

1

Во время тестирования я узнаю следующее: метод MP работает немного медленнее

def eat_time(j):
    result = []
    for j in range(10**4):
        a = 0
        for i in range(1000):
            a += 101
            result.append(a)
    return result

if __name__ == '__main__':
    #MP method
    t = time.time()
    pool = Pool()
    result = []
    data = pool.map(eat_time, [i for i in range(5)])
    for d in data:
        result += d
    print(time.time()-t) #11s for my computer

    #Normal method
    t = time.time()
    integers = []
    for i in range(5):
        integers += eat_time(i)
    print(time.time()-t) #8s for my computer

Однако, если я не требую, чтобы он eat_time() данные, изменяя eat_time() на

def eat_time(j):
    result = []
    for j in range(10**4):
        a = 0
        for i in range(1000):
            a += 101
            #result.append(a)
    return result

Время MP намного быстрее, и теперь для моего компьютера просто запустите 3s, в то время как обычный метод все еще занимает 8 секунд. (Как и ожидалось)

Мне кажется странным, поскольку result объявляется индивидуально в method, я не ожидаю, что добавление полностью разрушит MP.

Могу ли я знать, есть ли правильный способ сделать это? И почему MP медленнее при подключении?


Отредактировано для комментариев

спасибо для @torek и @akhavro уточняет суть.

Да, я понимаю, что процесс создания требует времени, поэтому проблема поднялась.

На самом деле исходный код помещал for-loop вовнутрь и вызывал простой метод снова и снова, он немного быстрее обычного метода в значительно большем количестве задач (в моем случае более 10 ** 6 вызовов).

Поэтому я переставляю код внутри и делаю метод немного сложнее. Переместившись for j in range(10**4): эта строка в eat_time().

Но похоже, что код усложняет причины задержки связи из-за большего размера данных.

Таким образом, вероятно, ответ не может решить его.

  • 0
    Какая версия Python?
  • 0
    @NimeshkaSrimal, я тестировал в 2.7, 3.7, оба результата одинаковы.
Показать ещё 9 комментариев
Теги:
performance
multiprocessing

1 ответ

2
Лучший ответ

Это не добавляет, что вызывает вашу медлительность, но возвращает результат с добавленными элементами. Вы можете проверить это, изменив свой код, чтобы добавить append, но возвратите только первые несколько элементов вашего результата. Теперь он должен работать намного быстрее.

Когда вы возвращаете свой результат работнику Pool, это на практике реализуется как очередь от многопроцессорности. Это работает, но это не чудо-исполнитель, безусловно, намного медленнее, чем просто манипулировать внутри памяти. Когда вы возвращаете много данных, очередь должна передавать много.

Нет простого решения. Вы можете попробовать общую память, но мне это не нравится лично из-за сложности. Лучше всего было бы перепроектировать ваше приложение, чтобы ему не нужно передавать много данных между процессами. Например, можно ли обрабатывать данные у вашего рабочего дальше, чтобы вам не нужно было возвращать все, кроме только обработанного подмножества?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню