ProcessPoolExecutor из concurrent.futures намного медленнее, чем многопроцессорная.

Я экспериментировал с новым блескомconcurrent.futures модуль введен в Python 3.2, и ямы заметили, что почти с идентичным кодом использование пула из concurrent.futuresпуть медленнее, чем с помощьюmultiprocessing.Pool.

Это версия, использующая многопроцессорность:

def hard_work(n):
    # Real hard work here
    pass

if __name__ == '__main__':
    from multiprocessing import Pool, cpu_count

    try:
        workers = cpu_count()
    except NotImplementedError:
        workers = 1
    pool = Pool(processes=workers)
    result = pool.map(hard_work, range(100, 1000000))

И это с помощью concurrent.futures:

def hard_work(n):
    # Real hard work here
    pass

if __name__ == '__main__':
    from concurrent.futures import ProcessPoolExecutor, wait
    from multiprocessing import cpu_count
    try:
        workers = cpu_count()
    except NotImplementedError:
        workers = 1
    pool = ProcessPoolExecutor(max_workers=workers)
    result = pool.map(hard_work, range(100, 1000000))

Использование наивногофункция факторизации взята из этогоЭли Бендерский статьяВот результаты на моем компьютере (i7, 64-bit, Arch Linux):

[juanlu@nebulae]─[~/Development/Python/test]
└[10:31:10] $ time python pool_multiprocessing.py 

real    0m10.330s
user    1m13.430s
sys 0m0.260s
[juanlu@nebulae]─[~/Development/Python/test]
└[10:31:29] $ time python pool_futures.py 

real    4m3.939s
user    6m33.297s
sys 0m54.853s

Я не могу профилировать их с помощью профилировщика Python, потому что я получаю ошибки рассола. Есть идеи?

Ответы на вопрос(1)

Ваш ответ на вопрос