Stavo sperimentando con il nuovo modulo lucido concurrent.futures introdotto in Python 3.2, e ho notato che, quasi con codice identico, usare Pool da concurrent.futures è modo più lento rispetto all'utilizzo di multiprocessing.Pool.ProcessPoolExecutor da concurrent.futures molto più lento di multiprocessing.Pool
Questa è la versione che utilizza multiprocessing:
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))
E questo sta usando 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))
utilizzando una funzione di fattorizzazione ingenuo preso da questo Eli Bendersky article, questi sono i risultati sul mio computer (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
Non riesco a profilarli con il profiler Python perché ottengo errori di pickle. Qualche idea?
Mi piace la tua convenzione di denominazione, in particolare 'worker' e' hard_work': P –
Cool, innit? : P – astrojuanlu