D statt C ?

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 22. November 2007, 10:36

Es ist zwar eher selten. Aber jetzt war mir Python etwas zu langsam. Es ging um ein Matching-Problem aus der Graphen-Theorie. Ein eigener Ansatz mit etwas optimiertem Brute-Force war gerade einmal bis 50 Knoten erträglich schnell, die Anpassung eines im Internet gefundenen Scripts mit dem Hopcroft-Carp-Algorithmus verbesserte es bis 500 Knoten. Probleme mit 100000 oder mehr Knoten ließen sich aber nicht mehr in vernünftiger Zeit lösen. Ich suchte also nach einer Möglichkeit, das Skript in eine kompilierte Sprache zu übertragen. Da es aber viel mit Dicts und Listen arbeitet, war dies in C nicht vernünftig zu lösen. Mit C++ kenne ich mich andererseits nicht gut genug aus.
D war für mich die Lösung: Python-Listen und -Dicts sind hier in ähnlicher Form als dynamische und assoziative Arrays implementiert. Die Umsetzung gelang somit fast 1 zu 1 innerhalb weniger Stunden, obwohl ich die Sprache nicht kannte. Der Geschwindigkeitsgewinn war erheblich. Ergebnisse von Problemen bis 5000 Knoten werden fast augenblicklich berechnet.
Ich denke, bei bestimmten Problemen ist D eine gute alternative zu C und v.a. C++. Hat schon jemand eigene Erfahrungen mit D gesammelt?
Hier ein Link: http://www.digitalmars.com/d/index.html
MfG
HWK
Zuletzt geändert von HWK am Donnerstag 22. November 2007, 16:21, insgesamt 1-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 22. November 2007, 13:51

Hast du dir eigentlich vorher Pyrex/Clython angesehen?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 22. November 2007, 16:08

Ich kenne Pyrex, habe damit aber bisher nicht ernsthaft gearbeitet, weil
1. Man muss den Original-Code oft anpassen. Ich musste jetzt z.B. eine LC und eine verschachtelte Funktionsdefinition beseitigen.
2. Das Kompilieren ist bei mir unter Windows mit Mingw z.T etwas umständlich.
3. Der Code muss nicht unbedingt schneller sein. Das Problem in meinem Beispiel ist, dass Pyrex natürlich dieselben Funktionen der Python/C-API verwendet wie der Python-Interpreter und deshalb die List- und Dict-Funktionen somit nicht entscheidend beschleunigt werden.
Testläufe mit 5000 und 10000 Knoten bestätigen das:
Reines Python: 12 - 53 s
Pyrex: 12 - 54 s
Psyco: 6 - 29 s (immerhin!)
D: 1 - 5 s

Clython kenne ich nicht.

Ich habe aber bereits einleitend gesagt, dass Python meistens ausreichend schnell ist. Es gibt aber sicher Fälle, in denen das Tempo wirklich wichtig ist. Und da sehe ich mit D eine interessante Alternative zu v.a. C++, die oft eine recht einfache Konversion zeitkritischer Python-Abschnitte zu D möglich machen könnte.
Mich interessiert einfach, ob jemand schon Erfahrungen mit D gemacht hat und wie er die Sprache einschätzt. Denn mit einem kleinen geschriebenen D-Progrämmchen möchte ich nicht von mir behaupten, die Sprache wirklich zu kennen.
MfG
HWK
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

Donnerstag 22. November 2007, 16:12

Leonidas hat geschrieben:Hast du dir eigentlich vorher Pyrex/Clython angesehen?
Huch, im Topic geirrt? :D Er fragt doch ob jemand auch schon eigene Erfahrungen mit D gesammelt hat und auch davon überzeugt war. Was hat das mit "Pyrex/Clython" zu tun :P


@HWK: Ich selber noch nicht, da keine Zeit. Aber D liegt, neben ein par andere, auf meiner ToDo-liste. Was ich aber sagen kann, ist das ich mir bei DM alle Infos mal durchgelesen habe und angenehm überrascht war :) D hat IMO viel Potenzial! Nachdem was ich bisher gelesen habe ist D das C/C++ was ich mir immer gewünscht habe :D

"bei bestimmten Problemen ist D eine gute alternative zu C und v.a. C++"
Ja, für uns nerds sowieso. :D Aber im Mainstream sehe ich da gewisse Probleme. IMO werden 20 Jahre vergehen bis D Akzeptanz gefunden hat und sich (wenn überhaupt) durchsetzt :roll: Ich denke ehr das wird keinen weiten anklang finden. Nichts was mich aber davon abhalten würde es trotzdem zu nutzen :)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 22. November 2007, 16:22

poker hat geschrieben:
Leonidas hat geschrieben:Hast du dir eigentlich vorher Pyrex/Clython angesehen?
Huch, im Topic geirrt? :D Er fragt doch ob jemand auch schon eigene Erfahrungen mit D gesammelt hat und auch davon überzeugt war. Was hat das mit "Pyrex/Clython" zu tun :P
Keineswegs:
HWK hat geschrieben:Aber jetzt war mir Python etwas zu langsam.
Da gibt es dann mehrere Möglichkeiten: das Programm in einer anderen Sprache schrieben oder performancekritische Teile des Python-Programms in Module auslagern, die in einer anderen Sprache implementiert sind. Nun ist Pyrex eine durchaus gangbare unv vergleichsweise simple Möglichkeit, um zweiteres zu erreichen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

Donnerstag 22. November 2007, 16:30

Leonidas hat geschrieben:
poker hat geschrieben:
Leonidas hat geschrieben:Hast du dir eigentlich vorher Pyrex/Clython angesehen?
Huch, im Topic geirrt? :D Er fragt doch ob jemand auch schon eigene Erfahrungen mit D gesammelt hat und auch davon überzeugt war. Was hat das mit "Pyrex/Clython" zu tun :P
Keineswegs:
HWK hat geschrieben: Mich interessiert einfach, ob jemand schon Erfahrungen mit D gemacht hat und wie er die Sprache einschätzt. Denn mit einem kleinen geschriebenen D-Progrämmchen möchte ich nicht von mir behaupten, die Sprache wirklich zu kennen.
MfG
HWK
Leonidas hat geschrieben:
HWK hat geschrieben:Aber jetzt war mir Python etwas zu langsam.
Da gibt es dann mehrere Möglichkeiten: das Programm in einer anderen Sprache schrieben oder performancekritische Teile des Python-Programms in Module auslagern, die in einer anderen Sprache implementiert sind. Nun ist Pyrex eine durchaus gangbare unv vergleichsweise simple Möglichkeit, um zweiteres zu erreichen.
Jo, dass schreibt er doch:
HWK hat geschrieben: Und da sehe ich mit D eine interessante Alternative zu v.a. C++, die oft eine recht einfache Konversion zeitkritischer Python-Abschnitte zu D möglich machen könnte.
Mag aber sein das "Konversion" nicht von HWK als "die teile in D auslagern und in Python-Script einbinden" gemeint war.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 22. November 2007, 16:43

poker hat geschrieben:Mag aber sein das "Konversion" nicht von HWK als "die teile in D auslagern und in Python-Script einbinden" gemeint war.
Das habe ich als erstes gemacht: Den kritischen Code in eine mit D erstellte Exe gepackt und die mitsubprocess aus Python aufgerufen. Als der entscheidende Geschwindigkeitsunterschied erreicht wurde, war aber nicht mehr viel im Python-Script übrig, so dass ich zum Schluss das Programm komplett in D geschrieben habe.
Statt eine Exe aus Python aufzurufen hätte man auch eine DLL mit ctypes verwenden können. Soweit bin ich aber noch nicht.
BlackJack

Donnerstag 22. November 2007, 18:09

Ich vermute mal Leonidas hat einen Fipptehler gemacht und meinte eigentlich Cython. Das ist ein Fork von Pyrex. Das Wiki wo die Veränderungen und Verbesserungen dokumentiert sind, ist anscheinend gerade down, aber LCs gehen mit Cython. Die Autoren haben als Ziel auch das Cython in die Standardbibliothek übernommen wird.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 23. November 2007, 00:00

Ich habe Cython ausprobiert. Es ist unwesentlich schneller als Pyrex, akzeptiert aber die LC:
5000 Knoten: 10 s
10000 Knoten: 46 s
MfG
HWK
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

Freitag 23. November 2007, 02:16

wikipedia hat geschrieben:Die C-Binärschnittstelle (ABI) wird genau so wie alle grundlegenden C-Typen unterstützt, wodurch Kompatibilität zu in C geschriebenen Bibliotheken gewährleistet ist.
Ergo kann man ein richtiges Modul in D machen und einfach importen. Habe momentan zu wenig Zeit, um das zu testen. Vielleicht nach Weihnachten.
BlackJack

Freitag 23. November 2007, 08:48

Dazu ist sicher Pyd hilfreich. Das ist sozusagen das Gegenstück zu Boost::Python für D. Selbst wenn man das nicht verwenden möchte, ist das D-Header-Modul für die C/Python-API von denen sicher eine Hilfe.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 23. November 2007, 13:59

BlackJack hat geschrieben:Ich vermute mal Leonidas hat einen Fipptehler gemacht und meinte eigentlich Cython.
Richtig, das meinte ich. Aber wie mir poker mitteilte, habe ich ja in den gaaaanz falschen Thread gepostet.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 23. November 2007, 14:18

Leonidas hat geschrieben:Aber wie mir poker mitteilte, habe ich ja in den gaaaanz falschen Thread gepostet.
Gut, dass wir poker haben! Sonst hätte das vielleicht niemand gemerkt...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Freitag 23. November 2007, 19:13

Um mal auf das Thema zurückzukommen (;)): Ich finde D schön. Es ist meiner Meinung nach viel logischer als C++ + STL, und ich komme einfach besser damit zurecht. Nachteil ist nur, dass der GNU-D-Compiler etwas hinterherhinkt und die Alternativ-Lib Tango unter Linux (nach meinen Erlebnissen) nicht so sehr leicht zu installieren ist. Es ist halt eine junge Sprache und hat einige Nachteile, aber mir gefällts :D
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 23. November 2007, 20:24

Je mehr ich mich damit beschäftige: Einige Dinge sind noch nicht ganz ausgereift. Aber ich würde auch nicht komplett in D programmieren wollen. Python liefert einfach viel schneller gute Ergebnisse. D scheint mir aber sehr gut dafür geeignet zu sein, zeitkritische Passagen für Python-Scripts zu programmieren. Und das ist viel einfacher als mit C, da in D Lists und Dicts praktisch von Haus aus mitgeliefert werden. Ich muss mich nicht erst mit umfangreichen Bibliotheken wie in C++ auseinandersetzen.
Ich möchte mich gar nicht mit den ganzen anderen Features von D wie OOP, Templates und wer weiß was sonst noch beschäftigen. Dies läßt sich angenehmer und schneller in Python lösen. Es wäre nur schön, wenn die Schnittstelle zwischen D und Python etwas optimiert werden könnte, so dass z.B. Python-Listen von Celerid automatisch in D-Arrays umgewandelt würden. Momentan ist es bei komplexen Parametern wahrscheinlich einfacher, ein komplettes D-Programm über Pipes aus Python aufzurufen.
MfG
HWK
Antworten