Python Performance und "Compiler"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
NexorProject
User
Beiträge: 4
Registriert: Dienstag 19. Februar 2013, 22:52

Hallo zusammen :)

Ich bin gerade neu zu euch ins Forum dazu gestossen. Mein weg führt mich vom Deutschem Java Programmierer Forum direkt zu euch :D
Ich war an einer Arbeit mit WebSockets wobei Java jedoch massive implementierungsprobleme aufzeigte. Dort wurde mir dann aufgrund vom Schwerpunkt Performance Python mit Tornado empfohlen. Als ich dazu auch noch ein gut verständliches und vorallem aktuelles Tutorial fand lies ich mich ein bisschen in die Sprache ein.

Was ich in erfahrung bringen konnte:
  • Python mit Tornado kann von der Connectivität mit WebSockets mit Java ohne probleme mithalten
  • Es ist eine Interpretiersprache und enthält dementsprechen keinen echten Compiler.
  • Python ist aufgrund der vorhergehenden Interpretierung langsamer als Compilierte Sprachen.
Nun zu meinen Fragen:
  • Wie schneidet Python von der Performance her im vergleich mit Java ab? Gibt es dazu aktuelle Statistiken? (Python 3+)
  • Ist es möglich ein Python Script welches eigene Dateien importiert (andere *.py Dateien) zu einer Datei zu packen und dann auf dem Server lediglich durch die Installation von Python selbst zu starten?
  • Wenn ja welchen "Compiler" empfehlt ihr mir dazu? Hättet ihr einen Downloadlink? (Habe viel gutes über CPython gelesen ich nutze Python 3.3.0, ist CPython dafür bereits kompatibel?)
  • Hält Python mehrere millionen gleichzeitige TCP Verbindungen Resourcenarm aus? (Natürlich ist bei der anforderung eine Hochleistungsmaschine vorausgesetzt)
  • Unterstützt Python Multithreading? (Kann ich sonst auch selbst nachschauen falls ihr denkt ich sei zu faul zum Googlen :P hatte bis jetzt nur noch keine Zeit dazu)
Mir ist diese Beantwortung ziemlich Wichtig da wir (Mein Team und ich) aufgrund von Charset und Implementierungsproblemen mit Java einen umstieg auf Python überdenken. Google ist mitlerweile leider sehr zugemüllt weshalb eine Suche schwerfällt wenn man nicht genau weiss wonach man suchen muss.

EDIT: Was ich noch erwähnen sollte...
Unser Projekt sieht nicht vor das pro Client grosse Datenmengen in kurzer Zeit verarbeitet werden müssen. Da jedoch viele gleichzeitige Connections zusammen kommen entsteht dennoch eine Enorme Datenverarbeitung. Es geht grundsätzlich mehr darum eine Echtzeit reaktion des Server zur erzielen und bei grossen Datenmengen (die hin und wieder anfallen können) den Trafficverbrauch durch kleine "Header" klein zu halten.

Ich bedanke mich schonmal vielmals und freue mich auf evt. noch viel Informativen Austausch mit euch :)

Mfg Nexor
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

CPython ist die Standardimplementierung von Python. Das nutzt du wahrscheinlich eh schon. Und es dürfte auch für euer Projekt das passendste sein, denn es soll ja offenbar eine Fremdbibliothek genutzt werden. Die ganzen Optimierungen bezüglich der Ausführungsgeschwindigkeit stecken dann eher in solchen externen Modulen anstatt im Interpreter selbst.

Ich habe jetzt allerdings keine Lust (und zum Teil auch nicht ausreichend Ahnung), um auf all deine anderen Fragen einzugehen. Sorry... ;)

Achja, vielleicht zumindest bezüglich Multithreading: Ja, Python unterstützt Threads. Allerdings werden dort keine betriebssystem-eigenen Threads benutzt. Falls es darum geht, Arbeit auf mehrere Prozessoren zu verteilen, dann wäre wohl eher das multiprocessing-Modul einen Blick wert. Python-Threads sind nämlich nur auf Single-Core ausgelegt. Um solche Angelegenheiten müsste sich aber eigentlich der `tornado`-Server schon selbst kümmern.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

snafu hat geschrieben:Falls es darum geht, Arbeit auf mehrere Prozessoren zu verteilen, dann wäre wohl eher das multiprocessing-Modul einen Blick wert. Python-Threads sind nämlich nur auf Single-Core ausgelegt. Um solche Angelegenheiten müsste sich aber eigentlich der `tornado`-Server schon selbst kümmern.
In dem Zusammenhang könnte auch die Kombination Nginx mit uWSGI eine Alternative sein.
BlackJack

@NexorProject: CPython ist der inoffizielle Name für die in C geschriebene Python-Implementierung, die man von Python.org bekommt. Der Name ist als Abgrenzung zu sehen wenn man zwischen Python der Sprache und der konkreten Referenzimplementierung unterscheiden möchte, oder zwischen verschiedenen Implementierungen.

CPython hat einen echten Compiler — und zwar einen der den Quelltext in Bytecode übersetzt. Also das was der Java-Compiler im Grunde auch macht. Wenn Schreibrechte bestehen, dann wird der Bytecode in *.pyc-Dateien gespeichert, was dann in etwa *.class-Dateien entspricht.

Ich denke ein allgemeiner Geschwindigkeitsvergleich macht nicht viel Sinn, weil der einfach nicht für die meisten konkrete Probleme relevant ist. Im Gegensatz zur Java-Welt, wo alles was es gibt noch einmal in Java (re)implementiert wird, wird bei Python vorhandenes, auch in anderen Sprachen programmiertes angebunden. Das heisst für die Sachen wo es auf Geschwindigkeit ankommt, werden üblicherweise Anbindungen an C- oder C++-Bibliotheken oder -Erweiterungsmodule verwendet.

Man kann Python-Dateien oder Bytecode-Dateien in ein ZIP-Archiv verpacken (Dateiendung *.egg) und das dann ausführen. Das macht aber kaum jemand. Ich habe das ehrlich gesagt so als Programmersatz noch nie gesehen. Sehe auch den Sinn nicht so wirklich.

Ich bin jetzt nicht so der Netzwerkprofi, aber braucht man pro TCP-Verbindung nicht einen Port und sind die nicht auf 64K beschränkt? In dem Fall wäre es nicht Python das mehrere Millionen gleichzeitiger Verbindungen verhindert.

Es gibt ein `threading`-Modul und das benutzt bei CPython auch echte Threads, allerdings kann davon immer nur *ein* Thread gleichzeitig Python-Bytecode ausführen. Das heisst diese Einschränkung muss nicht auf C-Code zutreffen der in Erweiterungsmodulen ausgeführt wird und trifft auch nicht auf alle alternativen Python-Implementierungen zu.

Wozu brauchst Du denn Threads? Ich dachte Tornado ist schon als fester Bestandteil der Lösung anvisiert? Dann verstehe ich allerdings nicht wieso Du Python 3.x verwendest, denn das was dazu auf der Tornado-Webseite steht klingt nicht als wollte man diese Kombination produktiv einsetzen. Solange Python 2.7 noch bei den meisten Linux-Distributionen das Standard-Python ist, würde ich von 3.x noch Abstand nehmen. Oder zumindest sicherstellen, dass es für 3.x schon alles an Bibliotheken gibt was man für ein Projekt braucht. Da gibt es noch Lücken die es bei 2.7 nicht gibt. Und das wird auch noch ein paar Jahre so bleiben schätze ich.

Ansonsten würde ich an Deiner Stelle einfach mal schauen ob Du Zeit und Ressourcen hast ein kleines Testszenario zu implementieren und Dir einen Eindruck verschaffen wie gut Python mit den Anforderungen, oder zumindest Ähnlichen, Eures Projekts klar kommt, statt allgemeine Benchmarks und Vergleiche mit Java zu suchen die nichts mit Eurem Projekt zu tun haben.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:Achja, vielleicht zumindest bezüglich Multithreading: Ja, Python unterstützt Threads. Allerdings werden dort keine betriebssystem-eigenen Threads benutzt. Falls es darum geht, Arbeit auf mehrere Prozessoren zu verteilen, dann wäre wohl eher das multiprocessing-Modul einen Blick wert. Python-Threads sind nämlich nur auf Single-Core ausgelegt. Um solche Angelegenheiten müsste sich aber eigentlich der `tornado`-Server schon selbst kümmern.
Doch natürlich werden Betriebssystem-Threads genutzt. Es gibt halt einen GIL, so dass nur ein Thread gleichzeitig Python-Code ausführen kann, aber es ist durchaus möglich in einem Betriebssystem-THread Python auszuführen und in anderen irgendwelche C-Module. Also, wenn man das haben will. Mit Tornado will man Threads vermutlich sowieso eher weniger.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
NexorProject
User
Beiträge: 4
Registriert: Dienstag 19. Februar 2013, 22:52

Das klingt an sich schon sehr gut :) Habe mich nochmals durch einige Performance Tests für unsere Hauptgebiete gelesen und denke wir werden uns nun mit Python tiefgehender beschäftigen.

Multithreading interessiert nur rand mässig, es war mir nur wichtig das es grundsätzlich möglich ist.
Mir wurde ZeroMQ auch dafür empfohlen was sehr gut strukturiert ist und es gibt eine menge guter Tutorials. Das bedeutet ein ansatz hätten wir schon.

Was ich jedoch niergends finden konnte ist wieviele offene Connections Tornado unterstützt.

Weisst jemand umgefähre Werte und wie Tornado die einzelnen Clients verwaltet (gleichzeitiges Empfangen auf allen kanälen (offenen Sockets)?).
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Da haste ein schönes Balkendiagramm. ;)

https://developers.facebook.com/blog/post/301/

Es dürfte aber auch sehr stark von dem verwendeten System abhängen. Ich würd's einfach ausprobieren. Ist natürlich ne blöde Sache, wenn man jetzt intensiv mit dem `tornado`-Framework entwickelt und dann feststellt, dass er im Livebetrieb unter hoher Last in die Knie geht. Andererseits untersteht das Ding ja (inzwischen) Facebook und da sollte man evtl einfach mal das Risiko eingehen, zu vertrauen, dass diese Bibliothek dementsprechend ausgereift ist (zumal sie ja als für solche Szenarien optimiert angepriesen wird). ;P

EDIT: Habe noch etwas in der Doku gefunden, was vielleicht wichtig ist:
We use epoll (Linux) or kqueue (BSD and Mac OS X; requires python 2.6+) if they are available, or else we fall back on select(). If you are implementing a system that needs to handle thousands of simultaneous connections, you should use a system that supports either epoll or queue.
Quelle: http://www.tornadoweb.org/documentation ... op-objects
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

NexorProject hat geschrieben:Weisst jemand umgefähre Werte und wie Tornado die einzelnen Clients verwaltet (gleichzeitiges Empfangen auf allen kanälen (offenen Sockets)?).
Die Anzahl der offenen Sockets hängt hauptsächlich vom OS, dessen Konfiguration, der Server Hardware und natürlich davon was deine Anwendung macht ab. Tornado selbst beschränkt nur insofern als dass es genauso wie die Anwendung Resourcen verbraucht.

Ich würde mir prinzipiell darum aber erstmal keine Gedanken machen, du wirst in jeder nicht-trivialen Anwendung sicherlich auf ganz andere Limits stoßen bevor du dir um die Anzahl der Sockets ernsthaft Gedanken machen musst.
NexorProject
User
Beiträge: 4
Registriert: Dienstag 19. Februar 2013, 22:52

Naja mir geht es eben darum zumindest schon einmal einen sicheren Punkt ausschliessen zu können.

@snafu: Zum "schönen Balkendiagramm" eine frage:
Ich habe dieses Diagramm mitlerweile schon ca 10x gesehen aber ...

...Ja hat sich denke ich geklärt. So wie es scheint sind das die maximalen Request pro Sekunde .. also würde ich daraus verstehen das das die empfangenden Nachrichten sind...

...was ist gemeint mit Connections/sec? Wieviele maximale Connections geöffnet sein können? Oder etwa wieviele Clients er pro Sekunde annehmen kann? oder sogar wieviel Client anfragen er bearbeiten kann (Daten empfangen -> Verarbeiten -> evt antwort senden)?

Jedoch schonmal vielen Dank an euch für eure Hilfe :)
Zuletzt geändert von NexorProject am Donnerstag 21. Februar 2013, 19:05, insgesamt 1-mal geändert.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
oder sogar wieviel Client anfragen er bearbeiten kann
Tornado ist doch "non-blocking", d.h. die Verbindung und die Verarbeitung der Daten ist zweierlei. Die englische Wikipedia-Seite zu Asynchronous_IObeschreibt das im 1. Satz sehr schön.

Gruß, noisefloor
NexorProject
User
Beiträge: 4
Registriert: Dienstag 19. Februar 2013, 22:52

Mir wurde in einem anderen Forum auf Python-Basis eher Gevent empfohlen. Jedoch wurde das Problem nun auf Java-Basis gelöst ich danke viel mals für euer Verständnis und eure Hilfe ;)

Kann Prinzipiel geclosed werden ausser ihr möchtet noch etwas wissen oder mir raten :)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier wird nichts geclosed. Man schreibt einfach nichts mehr rein bzw wartet bis in 3-4 Jahren irgendein Neuling den Thread wiederbelebt, weil ihm noch etwas zu dem Thema eingefallen ist... :evil:
Antworten