ProcessPoolExecutor aus der gleichzeitigen.futures Weise langsamer als multiprocessing.Pool

Ich war das Experimentieren mit neuen glänzenden gleichzeitige.futures - Modul eingeführt, in Python 3.2, und ich habe bemerkt, daß, mit fast identischen code, mit dem Pool von gleichzeitigen.futures ist Weg langsamer als mit multiprocessing.Pool.

Dies ist die version mit 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))

Und diese ist mit gleichzeitigen.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))

Mit einem naiven Faktorisierung Funktion dieser Eli Bendersky Artikel, dies sind die Ergebnisse auf meinem Rechner (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

Kann ich nicht Profil diese mit den Python-profiler, weil ich Gurke-Fehler. Irgendwelche Ideen?

  • Ich Liebe deine Namenskonvention, vor allem workers und hard_work 😛
  • Cool, innit? 😛
InformationsquelleAutor astrojuanlu | 2013-09-07
Schreibe einen Kommentar