2013-06-23 5 views
5

Ist es möglich, eine einzelne Task mit Multi-Processing/Threading zu beschleunigen? Mein Bauchgefühl ist, dass die Antwort "Nein" ist. Hier ist ein Beispiel dafür, was ich von einer „einzigen Aufgabe“ bedeuten:Beschleunigen Sie eine einzelne Task mit Multi-Processing oder Threading

for i in range(max): 
    pick = random.choice(['on', 'off', 'both']) 

Mit dem Argumente 10000000 es etwa 7,9 Sekunden dauert, auf meinem System zu vervollständigen.

Ich habe ein grundlegendes Verständnis der Verwendung von Multi-Processing und Threading für mehrere Aufgaben. Wenn ich zum Beispiel 10 Verzeichnisse habe, die jeweils X Dateien enthalten, die gelesen werden müssen, könnte ich 10 Threads erstellen.

Ich vermute, dass die einzelne Aufgabe nur einen einzigen Prozess verwendet (Task-Manager meldet CPU-Auslastung ist minimal). Gibt es eine Möglichkeit, meine anderen Kerne in solchen Fällen zu nutzen? Oder erhöhen Sie die CPU-/Speichergeschwindigkeit, um schnellere Ergebnisse zu erzielen?

+6

10 Multiprocessing kann helfen, mehrere Threads in einem Prozess nicht so viel (Stichwort: "globale Interpreter Sperre" aka "GIL") –

+0

@Michael Butscher: Könnten Sie ein Beispiel dafür geben, wie ich den Code, den ich erwähnt, mit Multiprocessing aufteilen könnte ? –

+3

Sie können http://mikecvet.wordpress.com/2010/07/02/parallel-mapreduce-in-python/ für ein Beispiel lesen –

Antwort

5

Hier ist ein Benchmark des Codes mit und ohne Multiprocessing:

#!/usr/bin/env python 

import random 
import time 

def test1(): 
    print "for loop with no multiproc: " 
    m = 10000000 
    t = time.time() 
    for i in range(m): 
     pick = random.choice(['on', 'off', 'both']) 
    print time.time()-t 

def test2(): 
    print "map with no multiproc: " 
    m = 10000000 
    t = time.time() 
    map(lambda x: random.choice(['on', 'off', 'both']), range(m)) 
    print time.time()-t 

def rdc(x): 
    return random.choice(['on', 'off', 'both']) 

def test3(): 
    from multiprocessing import Pool 

    pool = Pool(processes=4) 
    m = 10000000 

    print "map with multiproc: " 
    t = time.time() 

    r = pool.map(rdc, range(m)) 
    print time.time()-t 

if __name__ == "__main__": 
    test1() 
    test2() 
    test3() 

Und hier ist das Ergebnis auf meinem Arbeitsplatz (das ist ein Quad-Core):

for loop with no multiproc: 
8.31032013893 
map with no multiproc: 
9.48167610168 
map with multiproc: 
4.94983720779 

Ist es möglich, um eine einzelne Aufgabe mit Multi-Processing/Threading zu beschleunigen? Mein Bauchgefühl ist, dass die Antwort "Nein" ist.

gut, afaict, die Antwort ist "verdammt, ja".

Gibt es eine Möglichkeit, meine anderen Kerne in solchen Fällen zu nutzen? Oder erhöhen Sie die CPU-/Speichergeschwindigkeit, um schnellere Ergebnisse zu erzielen?

ja, durch Multiprozessing verwenden. Python kann aufgrund der GIL Threads nicht mit Threads umgehen, aber es kann sich darauf verlassen, dass der Scheduler Ihres Betriebssystems die anderen Kerne nutzt. Dann können Sie eine echte Verbesserung für Ihre Aufgaben bekommen.

+1

Die Antwort ist "verdammt, ja" nur, wenn Sie einen guten Computer verwenden. Auf meinem Netbook ist test3 langsamer als test1. – michaelmeyer

+1

die Antwort "verdammt ja" ist abhängig von der Anzahl der Kerne Ihres Computers hat. Wenn Sie einen Pool von Prozessen mit derselben Anzahl an Prozessen erstellen, die Sie mit Kernen versehen haben, profitieren Sie davon (vorausgesetzt, Sie haben mehr als einen Kern). Wenn nicht, wird es dasselbe sein (der Scheduler macht keine Wunder). – zmo

+1

@zmo: 3:16 hätte vielleicht "Hölle, ja!" Geschrien, aber "verdammt, ja" funktioniert auch :) Danke. –

Verwandte Themen