2016-11-03 10 views
0

У меня есть странное поведение с Python Multiprocessing Pool performance. В следующем коде data - это размер миллионов изображений, подлежащих изменению, а chunks_list - это куски data. Я использую pool = Pool(14). Функция resize_images изменяет размер группы изображений одновременно, в то время как resize_image изменяет размер изображения с надписью. Следующий код:Многопроцессорный пул хуже производительности на кусках

res = [pool.apply_async(resize_image, args=[img]).get() for img in data] 

быстрее, чем этот код:

chunks_list = [data[i:i + chunk_size] for i in range(0, len(data), chunk_size)] 
res = [pool.apply_async(resize_images, args=[imgs]).get() for imgs in chunks_list] 

Почему? Я ожидал, что обратное будет истинным, потому что первый код назначит много «крошечных» процессов в пул CPU. Но куски будут давать меньше заданий. Есть ли более эффективный способ достичь того, что я хочу? (Возможно, GPU)

+0

Если изображения большие, вы будете тратить много времени, просто перемещая их между процессами. – BlackBear

+0

@BlackBear Вот почему я сделал это в кусках, но был удивлен, что он медленнее. –

+0

@BlackBear Обратите внимание, что функция resize_images изменяет размер группы изображений одновременно, в отличие от resize_image, которые изменяют размер одного изображения. –

ответ

-1
pool.map(preprocess_images, [imgs for imgs in chunks]) 

выполнит работу быстрее, чем обе.

+0

add подробнее об ответе .... – sushildlh