Berechnungen beschleunigen ist ein Ziel, das jeder erreichen möchte. Was ist, wenn Sie ein Skript haben, das zehnmal schneller ausgeführt werden könnte als die aktuelle Laufzeit? In diesem Artikel werden wir uns Python Multiprocessing und eine Bibliothek namens Multiprocessing ansehen. Wir werden darüber sprechen, was Multiprocessing ist, seine Vorteile und wie Sie die Laufzeit Ihrer Python -Programme verbessern können, indem Sie parallele Programme verwenden.
Okay, also lass uns gehen!
Wenn Sie ein Python -Skript ausführen, wird Ihr Code normalerweise irgendwann zum Prozess und der Prozess wird auf einem einzigen Kern Ihrer CPU ausgeführt. Aber moderne Computer haben mehr als einen Kern. Was ist also, wenn Sie mehr Kerne für Ihre Berechnungen verwenden könnten? Es stellt sich heraus, dass Ihre Berechnungen schneller sein werden.
Nehmen wir dies vorerst als allgemeines Prinzip, aber später in diesem Artikel werden wir sehen, dass dies nicht allgemein wahr ist.
Ohne auf zu viele Details einzugehen, ist die Idee hinter der Parallelität, Ihren Code so zu schreiben, dass er mehrere Kerne der CPU verwenden kann.
Um die Dinge einfacher zu machen, schauen wir uns ein Beispiel an.
paralleles und serielles Computing
Was ist, wenn Sie drei Freunde haben, die gut in Mathe sind, die Ihnen helfen möchten? Jeder von ihnen berechnet die Quadratwurzel von zwei Zahlen, und Ihr Job wird einfacher, da die Arbeitsbelastung gleichermaßen zwischen Ihren Freunden verteilt ist. Dies bedeutet, dass Ihr Problem schneller gelöst wird.
Okay, also alles klar? In diesen Beispielen repräsentiert jeder Freund einen Kern der CPU. Im ersten Beispiel wird die gesamte Aufgabe nacheinander von Ihnen gelöst. Dies wird als Seriencomputer bezeichnet. Im zweiten Beispiel verwenden Sie, da Sie insgesamt mit vier Kernen arbeiten, Parallel Computing. Parallele Computing beinhaltet die Verwendung paralleler Prozesse oder Prozesse, die in mehreren Kernen in einem Prozessor unterteilt sind.
Wir haben festgestellt, was parallele Programmierung ist, aber wie verwenden wir sie? Nun, wir sagten zuvor, dass das parallele Computing die Ausführung mehrerer Aufgaben zwischen mehreren Kernen des Prozessors umfasst, was bedeutet, dass diese Aufgaben gleichzeitig ausgeführt werden. Es gibt einige Fragen, die Sie berücksichtigen sollten, bevor Sie sich der Parallelisierung nähern. Gibt es beispielsweise andere Optimierungen, die unsere Berechnungen beschleunigen können?
Nehmen wir vorerst an, dass die Parallelisierung die beste Lösung für Sie ist. Es gibt hauptsächlich drei Modelle im parallelen Computer:
In diesem Artikel werden wir das erste Modell veranschaulichen, das auch das einfachste ist.
Eine Möglichkeit, die Parallelität in Python zu erreichen, besteht darin, das Multiprozessungsmodul zu verwenden. Mit dem Multiprocessing -Modul können Sie mehrere Prozesse erstellen, von denen jeder mit einem eigenen Python -Interpreter. Aus diesem Grund führt die Python-Multiprozessierung prozessbasierte Parallelität durch.
Sie haben vielleicht von anderen Bibliotheken gehört, wie Threading, die auch mit Python integriert sind, aber es gibt entscheidende Unterschiede zwischen ihnen. Das Multiprocessing -Modul erstellt neue Prozesse, während Threading neue Threads erstellt.
Im nächsten Abschnitt werden wir uns mit den Vorteilen der Verwendung von Multiprocessing befassen.
Hier sind einige Vorteile der Multiprozessierung:
Der erste Vorteil hängt mit der Leistung zusammen. Da Multiprocessing neue Prozesse erzeugt, können Sie die Rechenleistung Ihrer CPU viel besser nutzen, indem Sie Ihre Aufgaben unter den anderen Kernen teilen. Meisten
Der zweite Vorteil befasst sich mit einer Alternative zur Multiprozessierung, die Multithreading ist. Themen sind jedoch keine Prozesse, und dies hat seine Konsequenzen. Wenn Sie einen Thread erstellen, ist es gefährlich, ihn zu töten oder sogar zu unterbrechen, wie Sie es mit einem normalen Prozess ausführen würden. Da der Vergleich zwischen Multiprozessing und Multithreading nicht im Rahmen dieses Artikels liegt, ermutige ich Sie, weitere Lesen darüber zu lesen.
Der dritte Vorteil der Multiprozessierung besteht darin, dass es recht einfach ist, da die Aufgabe, die Sie zu erledigen möchten, für eine parallele Programmierung geeignet ist.
Wir sind endlich bereit, einen Python -Code zu schreiben!
wir beginnen mit einem sehr grundlegenden Beispiel und verwenden es, um die Kernaspekte der Python -Multiprozessierung zu veranschaulichen. In diesem Beispiel haben wir zwei Prozesse:
Wir werden den untergeordneten Prozess verwenden, um eine bestimmte Funktion auszuführen. Auf diese Weise kann der Elternteil seine Ausführung fortsetzen.
Hier ist der Code, den wir für dieses Beispiel verwenden werden:
<span>from multiprocessing import Process </span> <span>def bubble_sort(array): </span> check <span>= True </span> <span>while check == True: </span> check <span>= False </span> <span>for i in range(0, len(array)-1): </span> <span>if array[i] > array[i+1]: </span> check <span>= True </span> temp <span>= array[i] </span> array<span>[i] = array[i+1] </span> array<span>[i+1] = temp </span> <span>print("Array sorted: ", array) </span> <span>if __name__ == '__main__': </span> p <span>= Process(target=bubble_sort, args=([1,9,4,5,2,6,8,4],)) </span> p<span>.start() </span> p<span>.join() </span>
In diesem Snippet haben wir eine Funktion namens Bubble_Sort (Array) definiert. Diese Funktion ist eine wirklich naive Implementierung des Blasensortierungsalgorithmus. Wenn Sie nicht wissen, was es ist, machen Sie sich keine Sorgen, denn es ist nicht so wichtig. Das entscheidende zu wissen, ist, dass es eine Funktion ist, die einige Arbeit leistet.
von Multiprocessing importieren wir den Klassenprozess. Diese Klasse stellt eine Aktivität dar, die in einem separaten Prozess ausgeführt wird. In der Tat können Sie sehen, dass wir einige Argumente bestanden haben:
Sobald wir eine Instanz für die Prozessklasse erstellt haben, müssen wir den Prozess nur starten. Dies geschieht durch das Schreiben von P.Start (). Zu diesem Zeitpunkt wird der Prozess gestartet.
Bevor wir beenden, müssen wir warten, bis der Kinderprozess seine Berechnungen beendet hat. Die join () -Methode wartet darauf, dass der Prozess endet.
In diesem Beispiel haben wir nur einen Kinderprozess erstellt. Wie Sie vielleicht vermuten, können wir mehr Kinderprozesse erstellen, indem wir mehr Instanzen in der Prozessklasse erstellen.
Was ist, wenn wir mehrere Prozesse erstellen müssen, um mehr CPU-intensive Aufgaben zu erledigen? Müssen wir immer explizit auf die Kündigung beginnen und warten? Die Lösung hier ist die Verwendung der Poolklasse.
Mit der Poolklasse können Sie einen Pool von Arbeitsprozessen erstellen, und im folgenden Beispiel werden wir uns ansehen, wie wir ihn verwenden können. Dies ist unser neues Beispiel:
<span>from multiprocessing import Process </span> <span>def bubble_sort(array): </span> check <span>= True </span> <span>while check == True: </span> check <span>= False </span> <span>for i in range(0, len(array)-1): </span> <span>if array[i] > array[i+1]: </span> check <span>= True </span> temp <span>= array[i] </span> array<span>[i] = array[i+1] </span> array<span>[i+1] = temp </span> <span>print("Array sorted: ", array) </span> <span>if __name__ == '__main__': </span> p <span>= Process(target=bubble_sort, args=([1,9,4,5,2,6,8,4],)) </span> p<span>.start() </span> p<span>.join() </span>
In diesem Code -Snippet haben wir eine Würfelfunktion (x), die einfach eine Ganzzahl erfordert und seine quadratische Wurzel zurückgibt. Einfach, richtig?
Dann erstellen wir eine Instanz der Poolklasse, ohne ein Attribut anzugeben. Die Poolklasse erstellt standardmäßig einen Prozess pro CPU -Kern. Als nächstes führen wir die Kartenmethode mit ein paar Argumenten aus.
Die Kartenmethode wendet die Würfelfunktion auf jedes Element des iterablen an, das wir bereitstellen - was in diesem Fall eine Liste jeder Zahl von 10 bis N.
istDer große Vorteil davon ist, dass die Berechnungen auf der Liste parallel geschehen!
Erstellen mehrerer Prozesse und parallele Berechnungen ist nicht unbedingt effizienter als serielles Computing. Bei niedrigen CPU-intensiven Aufgaben ist die serielle Berechnung schneller als die parallele Berechnung. Aus diesem Grund ist es wichtig zu verstehen, wann Sie Multiprocessing verwenden sollten - was von den Aufgaben abhängt, die Sie ausführen.
Um Sie davon zu überzeugen, schauen wir uns ein einfaches Beispiel an:
<span>from multiprocessing import Pool </span><span>import time </span><span>import math </span> N <span>= 5000000 </span> <span>def cube(x): </span> <span>return math.sqrt(x) </span> <span>if __name__ == "__main__": </span> <span>with Pool() as pool: </span> result <span>= pool.map(cube, range(10,N)) </span> <span>print("Program finished!") </span>
Dieses Snippet basiert auf dem vorherigen Beispiel. Wir lösen das gleiche Problem, nämlich die Quadratwurzel von N -Zahlen, jedoch auf zwei Arten. Der erste beinhaltet die Verwendung von Python -Multiprozessing, während der zweite nicht. Wir verwenden die Methode perf_counter () aus der Zeitbibliothek, um die Zeitleistung zu messen.
Auf meinem Laptop bekomme ich dieses Ergebnis:
<span>from multiprocessing import Pool </span><span>import time </span><span>import math </span> N <span>= 5000000 </span> <span>def cube(x): </span> <span>return math.sqrt(x) </span> <span>if __name__ == "__main__": </span> <span># first way, using multiprocessing </span> start_time <span>= time.perf_counter() </span> <span>with Pool() as pool: </span> result <span>= pool.map(cube, range(10,N)) </span> finish_time <span>= time.perf_counter() </span> <span>print("Program finished in {} seconds - using multiprocessing".format(finish_time-start_time)) </span> <span>print("---") </span> <span># second way, serial computation </span> start_time <span>= time.perf_counter() </span> result <span>= [] </span> <span>for x in range(10,N): </span> result<span>.append(cube(x)) </span> finish_time <span>= time.perf_counter() </span> <span>print("Program finished in {} seconds".format(finish_time-start_time)) </span>
Wie Sie sehen, gibt es mehr als einen Sekundenspunkt. In diesem Fall ist die Multiprozessierung besser.
Lassen Sie uns etwas im Code ändern, wie den Wert von N. Lassen Sie uns auf n = 10000 senken und sehen, was passiert.
Das bekomme ich jetzt:
<span>> python code.py </span>Program finished <span>in 1.6385094 seconds - using multiprocessing </span>--- Program finished <span>in 2.7373942999999996 seconds </span>
Was ist passiert? Es scheint, dass Multiprocessing jetzt eine schlechte Wahl ist. Warum?
Der Overhead, der durch Aufspalten der Berechnungen zwischen den Prozessen eingeführt wird, ist im Vergleich zu der gelösten Aufgabe zu stark. Sie können sehen, wie viel Unterschied es in Zeitaufführungen gibt.
In diesem Artikel haben wir über die Leistungsoptimierung des Python -Codes mithilfe von Python -Multiprocessing gesprochen.
Erstens haben wir kurz vorgestellt, was paralleles Computer ist und die Hauptmodelle dafür. Dann sprachen wir über Multiprocessing und seine Vorteile. Am Ende sahen wir, dass die Parallelisierung der Berechnungen nicht immer die beste Wahl ist, und das Multiprozessungsmodul sollte zur parallelisierenden CPU-gebundenen Aufgaben verwendet werden. Wie immer geht es darum, das spezifische Problem zu berücksichtigen, mit dem Sie konfrontiert sind, und die Vor- und Nachteile der verschiedenen Lösungen zu bewerten.
Ich hoffe, Sie haben festgestellt
FAQs über die Python -Multiprozessing und die parallele ProgrammierungWas sind die möglichen Fallstricke bei der Verwendung von Multiprozessing in Python? In Python kann die Geschwindigkeit und Effizienz Ihres Programms erheblich verbessern, es wird auch mit eigenen Herausforderungen verbunden. Eine der Hauptverfahren ist die erhöhte Komplexität Ihres Codes. Das Verwalten mehrerer Prozesse kann komplexer sein als das Verwalten eines einsthread-Programms, insbesondere wenn es um die Behandlung gemeinsamer Daten und die Synchronisierungsprozesse geht. Darüber hinaus ist das Erstellen eines neuen Prozesses ressourcenintensiver als das Erstellen eines neuen Threads, was zu einem erhöhten Speicherverbrauch führen kann. Schließlich sind nicht alle Aufgaben für die Parallelisierung geeignet, und in einigen Fällen kann der Aufwand des Erstellens und Verwaltens mehrerer Prozesse die potenziellen Leistungssteigerungen überwiegen. 🎜> Handhabung von Ausnahmen bei der Multiprozessierung in Python kann etwas schwierig sein, da Ausnahmen, die in Kindernprozessen auftreten, nicht auftreten sich automatisch auf den übergeordneten Prozess ausbreiten. Das Multiprocessing -Modul bietet jedoch verschiedene Möglichkeiten, Ausnahmen zu behandeln. Eine Möglichkeit besteht darin, die IS_ALIVE () -Methode der Prozessklasse zu verwenden, um zu überprüfen, ob noch ein Prozess ausgeführt wird. Wenn die Methode false zurückgibt, bedeutet dies, dass der Prozess beendet wurde, was auf eine Ausnahme zurückzuführen ist. Eine andere Möglichkeit besteht darin, das ExitCode -Attribut der Prozessklasse zu verwenden, mit dem weitere Informationen darüber geliefert werden können, warum ein Prozess terminiert ist. Andere Python -Bibliotheken. Es ist jedoch wichtig zu beachten, dass nicht alle Bibliotheken so konzipiert sind, dass sie in einer Multiprozesationsumgebung verwendet werden. Einige Bibliotheken sind möglicherweise nicht threadsicher oder unterstützen möglicherweise nicht die gleichzeitige Ausführung. Daher ist es immer eine gute Idee, die Dokumentation der Bibliothek zu überprüfen, die Sie verwenden, um festzustellen, ob sie die Multiprozessierung unterstützt.
- Ausnahmen ordnungsgemäß behandeln, um zu verhindern Umgebung.
Das obige ist der detaillierte Inhalt vonEin Leitfaden zur Python -Multiprocessing und zur parallele Programmierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!