Я экспериментировал с новым блестящим concurrent.futures модулем, представленным в Python 3.2, и я заметил, что почти с идентичным кодом использование пула из параллельного .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):
[[email protected]]─[~/Development/Python/test]
└[10:31:10] $ time python pool_multiprocessing.py
real 0m10.330s
user 1m13.430s
sys 0m0.260s
[[email protected]]─[~/Development/Python/test]
└[10:31:29] $ time python pool_futures.py
real 4m3.939s
user 6m33.297s
sys 0m54.853s
Я не могу профилировать их с помощью профилировщика Python, потому что я получаю ошибки рассола. Любые идеи?