Python / Perl - was ist besser geeignet?

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.
DanielH
User
Beiträge: 5
Registriert: Donnerstag 15. November 2007, 20:13

Donnerstag 15. November 2007, 20:34

Hallo zusammen,

ich bin gerade am überlegen, ob ich Python oder Perl lernen soll.

Bis gestern war ich dabei ein Script in php zu schreiben, bis ich leider
gemerkt habe, dass php viel zu langsam ist (bzw. mir ist klar geworden
das ich multithreading brauche, was es in php nicht ohne weiteres gibt).

Das Script soll eine Liste von Proxyservern und dazugehörigen Ports
nehmen, auf Erreichbarkeit und Anonymität prüfen & abspeichern. Da es
immer ein wenig dauert, bis die Verbindung steht bzw. bis ein time-out
kommt, dauert es „eine Weile“, bis man mit php z. B. 30.000 Proxys
überprüft hat (nämlich bis zu 250 Stunden, bei 30 sec bis time-out).


Deshalb „muss“ ich jetzt eine andere Script-/Programmiersprache lernen,
welche multithreading ermöglicht.


Neben Python und Perl war noch Ruby in der engeren Auswahl, was mir
extrem gefallen hat (ich find die Syntax extrem gut).

Leider gibt es dort aber anscheinend kein gescheites multithreading,
weswegen ruby wegfällt. Hier ein Zitat dazu:

„Erstens: Ruby verwendet sogenannte Green Threads [...]
Das Problem sind jetzt nicht die Green Threads an sich [...], sondern das
Ruby keinen Mechanismus besitzt um seine Threads auf mehrere Cores/
Prozessoren zu verteilen. Wuerde Ruby native Threads verwenden, dann
wuerde sich der Kernel darum kuemmern.

Zweitens: Ruby verwendet einen Time-Slice-Scheduler fuer Threads. Das
heisst das jeder Thread ca. 10ms zur verfuegung hat, um sein Zeug zu
erledigen, danach kommt der naechste Thread dran. Auch wenn der Thread
weniger als 10ms braucht. (Mehr Details hier)

Drittens: Sobald C-Code in einer Extension ausgefuehrt wird (bzw.
allgemein kompilierter Code), blockiert der Interpreter die weitere
Ausfuehrung von Ruby-Code, bis der Code der Extension fertig ist.“

Quelle: http://forum.ruby-portal.de/viewtopic.p ... 67b1#33950


Meine erste Frage ist jetzt, ob Python auch nur solche Threads ermöglicht,
oder ob ich damit mehrere Proxys gleichzeitig überprüfen kann (1000
gleichzeitige Threads wären ideal ;) ).


Außerdem interessiert mich, welche Scriptsprache eurer Meinung nach
effektiver ist (und mit effektiv meine ich schneller in der Abarbeitung der
Aufgaben).

Schon mal Danke für's Lesen und an alle die mir bei meiner Entscheidung
helfen wollen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 15. November 2007, 21:55

Hallo DanielH, willkommen im Forum,
DanielH hat geschrieben:Bis gestern war ich dabei ein Script in php zu schreiben, bis ich leider
gemerkt habe, dass php viel zu langsam ist (bzw. mir ist klar geworden
das ich multithreading brauche, was es in php nicht ohne weiteres gibt).
Multithreading gibt es in Python zwar, aber auch den GIL. Ich hatte damit zwar nie ein Problem, aber ich habe auch nie massives Multithreading gebraucht.
DanielH hat geschrieben:Neben Python und Perl war noch Ruby in der engeren Auswahl, was mir
extrem gefallen hat (ich find die Syntax extrem gut).
Ich finde die Syntax von Ruby nicht ganz so toll, das überflüssige end hat mit meist gestört und Ruby lädt irgendwie ein, tollen Code zu schreiben, der aber auch nicht ohne weiteres verständlich ist.
DanielH hat geschrieben:Außerdem interessiert mich, welche Scriptsprache eurer Meinung nach
effektiver ist (und mit effektiv meine ich schneller in der Abarbeitung der
Aufgaben).
Effektiv sind beide, meintest du effizient?
DanielH hat geschrieben:Schon mal Danke für's Lesen und an alle die mir bei meiner Entscheidung
helfen wollen.
Die Antwort ist weder Python noch Perl (zumindest nicht erstrangig) sondern Multiprocessing statt Multithreading. In der Oktoberausgabe des Python Magazine findest zu ab Seite 5 eine Vorstellung von pyprocessing und Parallel Python, welche einem mit Multiprocessing helfen.
Natürlich kannst du das auch mit PHP, Perl oder Ruby machen...
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Donnerstag 15. November 2007, 22:13

@DanielH: Weder die "Green"-Threads bei Ruby noch das GIL bei Python sollten für Dich ein Problem darstellen. Dein Code ist nicht CPU- sondern IO-intensiv d.h. die meiste Zeit wird sowieso mit warten auf Daten verbracht.

Und 1000 Threads solltest Du schnell wieder vergessen. Da erreicht man ganz schnell Begrenzungen vom Betriebssystem. Zum Beispiel bei der Anzahl der gleichzeitig offenen Verbindungen. Und jeder Thread hat seinen eigenen Stack. Mal angenommene 1 MiB Stack pro Thread, verbraucht dass mal eben relativ sinnlos 1 GiB Speicher.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Donnerstag 15. November 2007, 22:30

BlackJack hat geschrieben:Dein Code ist nicht CPU- sondern IO-intensiv d.h. die meiste Zeit wird sowieso mit warten auf Daten verbracht.
Waere das was fuer asyncore/asynchat?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Donnerstag 15. November 2007, 23:53

Rebecca hat geschrieben: Waere das was fuer asyncore/asynchat?
Sicher geht das mit asyncore, da gibts dann so schön 1 Thread der alle Sockets überwacht, man muss halt einfach das HTTP-Zeugs selber schreiben.

Gruss
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Freitag 16. November 2007, 10:06

@DanielH:

Auch ein Willkomemn meinerseits!
Ich programmiere teils in python, teils in perl, neuerdings schau ich mir auch C# an, aber das nur nebenbei.
Perl ist optimal für dein vorhaben, garantiert! ;)
Es gibt vorallem genügend Dokumentationen... falls du was an Material brauchst sag bescheid.
Und wenn du schon dutzende Server testest, dann ist für dich vlt fierce intressant 8)

Perl ist kryptischer als andere Sprachen, aber gerade das lieb ich irgendwie an der Sprache.
Vorallem brauchste verdammt wenig Zeilen um teils schon komplexe Sachen zu machen im Gegensatz zu anderen Sprachen!

Hätte auch noch ein e-book im angebot wo beschrieben ist wie man sich ne Spider baut :roll:

Zu deiner Frage bezüglich der effektivität:

Ich hab den Eindruck, das Python schon irgendwie schneller ist in manchen Bereichen (Minimal), aber wenns um Internet geht -> perl, ganz klar.

-> google -> fierce site:ha.ckers.org

heide!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 16. November 2007, 10:48

BlackJack hat geschrieben:Und 1000 Threads solltest Du schnell wieder vergessen. Da erreicht man ganz schnell Begrenzungen vom Betriebssystem. Zum Beispiel bei der Anzahl der gleichzeitig offenen Verbindungen.
Naja, die Anzahl der Threads sollte nicht so das Problem sein.
Wikipedia zu NPTL hat geschrieben:In tests, NPTL succeeded in starting 100,000 threads on a IA-32 in two seconds. In comparison, this test under a kernel without NPTL would have taken around 15 minutes.
Man nuss nur den per-Thread-Speicher klein halten. Ist aber relativ aufwendig unter Python.

Also: asnycore nutzen oder mehrere Worker-Prozesse.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Freitag 16. November 2007, 11:16

Der zitierte Artikel zeigt genau das Problem mit Threads: ob das (effizient) funktioniert hängt stark von der Implementierung der Threads ab. Es gibt ja auch noch andere Betriebssysteme und da oft auch mehrere Thread-Implementierungen.

Und ob man wirklich tausende von Sockets gleichzeitig aufmachen kann ist auch so eine Frage. Das sind letztendlich auch Kernel-Resourcen die nicht unbegrenzt sind. Wenn man zuviele Verbindungen öffnet kann es auch passieren, das man Zeitüberschreitungen bekommt, weil der Netzzugang "dicht" ist, obwohl die Gegenseite eigentlich antworten könnte.

Das Problem bei sequentieller Abarbeitung ist ja, das einige Gegenstellen blockieren bis die Zeitüberschreitung eintrifft. Lösung: mehrere Anfragen starten, damit die schnelleren abgefertigt werden können während auf die langsamen gewartet wird. Effiziente Lösung wäre es vielleicht mehrere Anfragen zu starten und per `select` zu wählen und immer wenn Anfragen zu lange blockieren diese an einen Thread weiter zu reichen, der sich um die lahmen Enten kümmert, wieder mit mehreren Anfragen und `select`. Das kann man sicher auch kaskadieren. Auf diese Weise hat man eine "Expressabfertigung" wo die schnellen Fälle zügig abgearbeitet werden und gleichzeitig eine gute Kontrolle darüber wieviele Anfragen gleichzeitig laufen.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Freitag 16. November 2007, 11:23

Hallo,

eventuell mit generatoren und Microthreads machbar in Python?
Zuletzt geändert von pyStyler am Samstag 17. November 2007, 09:41, insgesamt 1-mal geändert.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Freitag 16. November 2007, 11:49

pyStyler hat geschrieben:Hallo,

eventuell mit generatoren und Microthreads machbar in Python?

Gruss
Driton
Ich bin mir nicht so ganz sicher, ob ich das Stichwort "Microthreads" gerade gedanklich richtig einordne, aber ich meine "ja", gucke dir mal "yield" an.

Beipsiel:

Code: Alles auswählen

def generator():
  yield 1
  yield 2
  print "vor 3"
  yield 3

for x in generator():
  print "-"
  print x
[/code]
BlackJack

Freitag 16. November 2007, 11:57

Microthreads, Co-Routinen, Actors, Greenlets, Tasklets, … irgendwie scheint da jede Implementierung ihren eigenen Namen für erfinden zu wollen. :-)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 16. November 2007, 12:13

BlackJack hat geschrieben:Der zitierte Artikel zeigt genau das Problem mit Threads: ob das (effizient) funktioniert hängt stark von der Implementierung der Threads ab. Es gibt ja auch noch andere Betriebssysteme und da oft auch mehrere Thread-Implementierungen.
Ja, wenn man aber ein schlechtes OS verwendet, hat man so oder so schlechte Karten, das wird sicherlich nicht das einzige Problem damit gewesen sein. :)

Achja, ich werfe auch noch Continuations in die Runde. :D
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Freitag 16. November 2007, 14:41

skypa hat geschrieben:Perl ist kryptischer als andere Sprachen, aber gerade das lieb ich irgendwie an der Sprache.
Vorallem brauchste verdammt wenig Zeilen um teils schon komplexe Sachen zu machen im Gegensatz zu anderen Sprachen!
Da Code weit öfter gelesen als geschrieben wird, ist das ein grenzwertiges Argument. Nicht, dass wenig Code schlecht wäre, im Gegenteil. Doch wenn er nicht leicht lesbar und verständlich ist, wirkt das dem Vorteil wieder deutlich entgegen.
DanielH
User
Beiträge: 5
Registriert: Donnerstag 15. November 2007, 20:13

Samstag 17. November 2007, 02:26

Danke Leute.

Leonidas schrieb:
Ich finde die Syntax von Ruby nicht ganz so toll, das überflüssige end hat mit meist
gestört und Ruby lädt irgendwie ein, tollen Code zu schreiben, der aber auch nicht ohne
weiteres verständlich ist.
Der Vorteil dabei ist, dass man den Code per Tastendruck einrücken lassen kann (falls die
IDE das unterstützt). So ist funktioniert das zumindest bei meiner php IDE (Zend Studio).

Oder funktioniert das auch mit Python? (Kann ja eigentlich überhaupt nicht gehen, soweit
ich das sehe).


BlackJack schrieb:
@DanielH: Weder die "Green"-Threads bei Ruby noch das GIL bei Python sollten für Dich
ein Problem darstellen. Dein Code ist nicht CPU- sondern IO-intensiv d.h. die meiste Zeit
wird sowieso mit warten auf Daten verbracht.
Ach so, die Wartezeit wird dem Thread nicht angerechnet.
Allerdings funktioniert das nur bei solchen einfachen Sachen; wenn ich später etwas
komplexeres machen will, müsste ich wieder eine neue Sprache lernen.

BlackJack schrieb:
Und 1000 Threads solltest Du schnell wieder vergessen. Da erreicht man ganz schnell
Begrenzungen vom Betriebssystem. Zum Beispiel bei der Anzahl der gleichzeitig offenen
Verbindungen. Und jeder Thread hat seinen eigenen Stack. Mal angenommene 1 MiB
Stack pro Thread, verbraucht dass mal eben relativ sinnlos 1 GiB Speicher.
Also 100 Threads würden mir auch schon reichen ;)


skypa schrieb:
[...] neuerdings schau ich mir auch C# an, aber das nur nebenbei.
C# in Verbindungen mit ASP.NET soll auch extrem leistungsfähig sein (Für Server-
Applikationen). Allerdings wechsle ich demnächst von Windows zu Linux,
und da wäre es dumm, wenn ich C# lernen würde.

Perl ist optimal für dein vorhaben, garantiert! ;)
Ich hab den Eindruck, das Python schon irgendwie schneller ist in manchen Bereichen
(Minimal), aber wenns um Internet geht -> perl, ganz klar.
Danke, ich schätze dann seh' ich mir erstmal Perl etwas genauer an. Meine Scripte sollen
nämlich in erster Linie auf Servern laufen.

Das Gute ist, dass ich bereits seit längerem ein multithread Perl Script habe, was genau
macht, was ich haben will. Ich müsste nur ein paar Änderungen machen, um es an
meine Bedürfnisse anzupassen.


Leonidas schrieb:
Die Antwort ist weder Python noch Perl (zumindest nicht erstrangig) sondern
Multiprocessing statt Multithreading. In der Oktoberausgabe des Python Magazine findest
zu ab Seite 5 eine Vorstellung von pyprocessing und Parallel Python, welche einem mit
Multiprocessing helfen. Natürlich kannst du das auch mit PHP, Perl oder Ruby machen...
Meinst du forken? Das war das Einzige, was ich zu dem Thema bei php gefunden habe.
Das scheint aber ziemlich schwierig zu sein (ich hab mehrmals gelesen, dass sogar
erfahrene php Entwickler vor forken zurückschrecken). Ich hab zwar eine php-classe
gefunden, die das forken vereinfachen soll (welche sich allerdings noch im Beta-Stadium
befindet), aber ich weiß nicht... php scheint für so was nicht gerade geeignet zu sein.

Ich denke ich werde lieber anfangen Perl zu lernen, anstatt mich mit php weiter zu
beschäftigen.


Allerdings habe ich gedacht, dass Python die effizientere Sprache für's Internet ist. Der
Grund weshalb ich angefangen habe mich für Python zu interessieren, ist nämlich, dass
Googles Spider anscheinend in Python geschrieben ist (hab ich an zwei
verschiedenen Stellen gelesen). Und ich denke nicht, dass die bei den Millionen Seiten,
die Google pro Tag spidert, etwas nehmen, wenn es was geeigneteres gäbe. Aber wer
weiß, ob das überhaupt stimmt...

btw. Google sucht anscheinend Python Programmierer:
http://www.google.de/search?client=oper ... lr=lang_de

Und wie's aussieht ist Google nicht gerade der schlechteste Arbeitgeber:
http://www.sueddeutsche.de/wirtschaft/a ... 73/112661/
(Zu dem Thema gab's ma ein richtig krasses Viedeo auf YouTube;
ich find's aber irgendwie nicht mehr..)


PS: Python muss ich mir aber früher oder später auch mal genauer ansehen;
was bisher gesehen habe, hat mir ziemlich gut gefallen.

PPS:
Effektiv sind beide, meintest du effizient?

Genau, ich hab effizient gemeint ;)
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 17. November 2007, 08:59

skypa hat geschrieben:Perl ist kryptischer als andere Sprachen, aber gerade das lieb ich irgendwie an der Sprache.
Vorallem brauchste verdammt wenig Zeilen um teils schon komplexe Sachen zu machen im Gegensatz zu anderen Sprachen!
Ich denke da sollte man unterscheiden, ob man mit wenig Code viel machen kann oder ob man Code durch Abkürzungen kryptisch "komprimieren" kann.

Bei Perl kann man super toll kryptisch kleinen Code schreiben. Wichtiger ist jedoch der erste Punkt, das man komplexe Dinge mit wenigen Codezeilen erledigen kann, weil es eine mächtigen Bibliothek gibt. Stichwort: [wiki=Allgemeine_Begriffe#B]batteries included[/wiki], siehe auch http://de.wikipedia.org/wiki/Python_%28 ... bibliothek

Wobei natürlich Perl auch eine Menge bietet, so ist es nicht.

Was ich eigentlich sagen wollte: Das man in Perl kryptischen, kleinen Code schreiben kann, ist IMHO ehr ein Nachteil. Was hat man davon wirklich, außer den wow Effekt? Besser ist es doch, das man Code auch nach einiger Zeit noch gut lesen kann.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten