Многопроцессорная обработка Python: почему большие куски медленнее?
Я профилировал некоторый код, используя многопроцессорный модуль Python (функция 'job' просто возводит число в квадрат).
data = range(100000000)
n=4
time1 = time.time()
processes = multiprocessing.Pool(processes=n)
results_list = processes.map(func=job, iterable=data, chunksize=10000)
processes.close()
time2 = time.time()
print(time2-time1)
print(results_list[0:10])
Одна вещь, которую я нахожу странной, это то, что оптимальный размер фрагмента составляет около 10 тыс. Элементов - на моем компьютере это заняло 16 секунд. Если я увеличу размер фрагмента до 100К или 200К, то он замедлится до 20 секунд.
Может ли это быть связано с тем, что для длинных списков требуется больше времени для травления? Размер фрагмента из 100 элементов занимает 62 секунды, что, как я полагаю, связано с дополнительным временем, необходимым для передачи фрагментов назад и вперед между различными процессами.
1 ответ
Об оптимальном размере:
- Имея тонны маленьких порций, можно было бы более эффективно распределить нагрузку по 4 различным рабочим, поэтому желательны были бы более мелкие порции.
- С другой стороны, изменения контекста, связанные с процессами, увеличивают накладные расходы каждый раз, когда должен обрабатываться новый фрагмент, поэтому желательно меньшее количество изменений контекста и, следовательно, меньшее количество фрагментов.
Поскольку оба правила требуют разных подходов, точка в середине - это путь, аналогичный графику спроса и предложения.