Warum Python ist nicht besser in Multiprocessing oder Multithreading-Anwendungen als Java?

Da Python einige Probleme mit GIL hat, ist Java besser für die Entwicklung von Multiprocessing-Anwendungen. Könnten Sie bitte die genaue Begründung der effektiven Verarbeitung von Java als Python in Ihrem Weg rechtfertigen?

3 Solutions collect form web for “Warum Python ist nicht besser in Multiprocessing oder Multithreading-Anwendungen als Java?”

Das größte Problem beim Multithreading in CPython ist das Global Interpreter Lock (GIL) (Beachten Sie, dass andere Python-Implementierungen dieses Problem nicht unbedingt teilen!)

Die GIL ist ein Implementierungsdetail, das die gleichzeitige Ausführung von separaten Threads in Python wirksam verhindert. Das Problem ist, dass, wenn Python-Byte-Code ausgeführt werden soll, dann muss der aktuelle Thread die GIL erworben haben und nur ein einziger Thread kann die GIL zu einem gegebenen Zeitpunkt haben.

Also, wenn 5 Threads versuchen, einen Python-Code auszuführen, dann werden sie effektiv eine nach dem anderen laufen, denn jeder muss warten, bis die GIL zur Verfügung stehen. Dies ist in der Regel kein Problem mit Single-Core-Computern, da die physischen Einschränkungen die gleiche Wirkung haben: Nur ein einziger Thread kann zu einem Zeitpunkt laufen.

In Multi-Core / SMP-Computern, aber dies wird ein Engpass (und die werden immer häufiger jede Minute).

Java hat keine solchen Einschränkungen, so dass mehrere Threads gleichzeitig ausgeführt werden können.

Ich glaube, du hast deine eigene Frage beantwortet. Python hat Probleme durch das "Global Interpreter Lock" (GIL).

Erster Treffer bei Google für "python gil": http://www.grouplens.org/node/244

Ich würde nicht zustimmen, dass Python ist nicht besser als Java für Multi-Processing-Anwendung.

Zuerst gehe ich davon aus, dass das OP "besser" verwendet, um "schnellere Codeausführung" zu verstehen, soweit ich es sagen kann.

Ich leide unter "Speed-Freak" -Syndrom, vermutlich aus einem C / ASM-Hintergrund gekommen, also habe ich viel Zeit damit verbracht, auf den Grund zu kommen "ist Python langsam?" Problem.

Die einfache Antwort darauf? "Es kann sein." Hier sind einige wichtige Punkte:

1) Mit einer Multi-Thread-Anwendung wird Python einen Nachteil für jede Sprache haben, die nicht so etwas wie die GIL hat. Die GIL ist ein Artefakt der Python VM in CPython, nicht die Python-Sprache selbst. Einige Python VM's wie Jython, IronPython, etc haben keine GIL.

2) In einer Multi-Prozess-Anwendung, die GIL nicht wirklich anwenden, und so können Sie jetzt beginnen, um eine schnellere Ausführung Ihres Python-Code unbemerkt zum größten Teil durch die GIL nutzen. Ich schlage vor, wenn du einen großen Python-Code schreiben möchtest, der sowohl Geschwindigkeit als auch Gleichzeitigkeit benötigt, die du über Multi-Processing lernst und möglicherweise ZMQ / 0MQ für Nachrichtenübergabe.

3) Unabhängig von der GIL zeigt Java eine schnellere Codeausführung als Python in vielen Bereichen. Dies ist auf native Unterschiede in, wie Python behandelt Objekte in Erinnerung:

  • Eine Reihe von Python-Funktionen erstellen Kopien von Objekten im Speicher, anstatt sie zu modifizieren (siehe http://www.skymind.com/~ocrow/python_string/ für Beispiele)

  • Python verwendet Dict, um Attribute für Objekte zu speichern usw. Ich möchte nicht ablenken und in diese Bereiche eintauchen, aber ich kann in der Regel sagen, dass einige der "ordentlichen" Dinge, die Python tun kann, mit einer Geschwindigkeit kosten. Es ist auch wichtig zu wissen, dass es Möglichkeiten, um das Standard-Verhalten, wenn das ist zu hoch von einer Geschwindigkeit Strafe für Sie verursacht.

4) Einige der Geschwindigkeit von Java ist auf mehr Optimierung in der Java VM über Python so weit wie ich sagen kann. Sobald Sie die Unterschiede in wie viel hinter-die-Szenen Speicher / Objekt Arbeit abgeschlossen ist, kann Java oft noch Python schlagen. Ist es denn Java hat mehr Aufmerksamkeit als Python? Ich bin mir nicht sicher, mit genug Finanzierung fühle ich, dass CPython schneller sein könnte.

Ich werde sagen, dass ich mich entschlossen habe, Python fast 100% mit neuem Code voranzutreiben.

Fallen Sie nicht in die vorzeitige Optimierungsfalle, und denken Sie daran, Sie können immer C-Code in einer Prise. Machen Sie Ihren Code gut funktionieren, machen Sie es wartbar, dann beginnen zu optimieren, sobald die Geschwindigkeit der Anwendung ist nicht schnell genug für Ihre Bedürfnisse.

Interessante Benchmarks:

http://benchmarksgame.alioth.debian.org/u64/python.php

Weitere Informationen zu Python Speed ​​Fragen finden Sie hier:

http://www.infoworld.com/d/application-development/van-rossum-python-not-too-slow-188715

  • In jython, gibt es eine pythonische Art der Einreichung einer Methode an die EDT?
  • Python Multi-Threading langsamer als seriell?
  • Gibt es irgendwelche eingebauten Funktionen, die auf I / O blockieren, die nicht zulassen, dass andere Threads laufen?
  • Python Urllib UrlOpen Lesen
  • Threading und Multiprocessing von Modulen in Python
  • Wie man den geschlossenen Griff in einem Arbeiterfaden benutzt
  • Python-Threading scheint sequentiell Threads auszuführen
  • Python PyQT: Wie rufe ich eine GUI-Funktion aus einem Worker-Thread?
  • Python und Threading: Warum ist "große" Liste Entity verloren, wenn der Zugriff von anderen Methoden?
  • Wie benutzt man Threads, um die Eingabe von der Tastatur in Python 3 zu bekommen?
  • Parallelität in Python funktioniert nicht richtig
  • Python ist die beste Programmiersprache der Welt.