Seite 1 von 2

Python Tempo

Verfasst: Sonntag 21. August 2005, 09:57
von Tester
Hallo

habe gerade vor ein paar Tagen Python kennengelernt -- grossartig!

Endlich eine kleine Sprache mit einfacher Syntax, die einem einerseits
die Bits- und Pointer-Pfriemelei von C/C++ erspart, andererseits
portable GUI-Programmierung bietet und höhere Datenstrukturen wie
Dictionaries und Bignums mit eingebaut hat.

Nur eines irritiert mich bei aller Begeisterung etwas bei meinen ersten Python-Experimenten:

Ein Apfelmännchen in Briefmarkengröße benötigt zur Berechnung bei mir
etwa eine Minute, also genauso lang wie das entsprechende Amiga-Basic
-Programm vor 20 Jahren auf einer Maschine, die zweitausendmal weniger
Speicher als mein PC hatte und fünfhundertmal langsamer getaktet war.

Ist das symptomatisch für Python ?
Grüße

Verfasst: Sonntag 21. August 2005, 10:16
von Clython
Python ist schon langsamer als C(++) und Java, da die Sprache interpretiert ist. Aber dass das Rendern eines Apfelmännchens 1 Minute dauern soll, ist schon komisch. Vielleicht würde es helfen, wenn du mal den Code posten würdest. Ich bin zwar nicht so das Python-Genie, aber die Genies auf dem Board werden dir sicher sagen können, ob etwas uneffektiv gecodet ist, oder es sonst ein Problem gibt.

Verfasst: Sonntag 21. August 2005, 11:26
von ProgChild
Ich hab hier einen Artikel, darüber, wie du dein Python Programm auf Geschwindigkeit hin optimierst.

re

Verfasst: Sonntag 21. August 2005, 12:14
von Tester
Es ist die Tkinter-Version des Apfelmännchens aus der Abteilung
"snippets".

Danke für den Link zum Thema "Python Speed-up".

Inzwischen habe ich einige weitere Tests gemacht, denen zufolge
reine Rechenaufgaben mit großen Zahlen erstaunlich schnell gehen -
Fakultät von 100000 usw... - vielleicht ist es das Tkinter, das bei
Grafik-Ausgabe bremst.
Turtle ist ja auch nicht so arg schnell.

Grüße

Re: re

Verfasst: Sonntag 21. August 2005, 12:48
von gerold
Tester hat geschrieben:Es ist die Tkinter-Version des Apfelmännchens aus der Abteilung "snippets".
Hi!

Verschiebe in diesem Beispiel den Befehl can.pack() eine Zeile oberhalb die Zeile root.mainloop(). Dann weißt du was so lange dauert.

http://www.python-forum.de/viewtopic.php?p=14097#14097

Grafikoperationen, die in Echtzeit auf dem Bildschirm angezeigt werden, brauchen generell lange, da dadurch eine sehr komplexe Maschinerie in Gang gesetzt wird. Man kann dieses Verhalten aber abfangen, indem man entweder die Grafik im Hintergrund zeichnet und wenn sie fertig ist, in den Vordergrund holt, oder indem man die Bildschirmaktualisierung jeweils für ein paar zehn/hundert Iterationen sperrt.

mfg
Gerold
:-)

Re: Python Tempo

Verfasst: Sonntag 21. August 2005, 16:19
von jens
Tester hat geschrieben:Ein Apfelmännchen in Briefmarkengröße benötigt zur Berechnung bei mir etwa eine Minute
Du hast wohl dieses Skript genommen:
http://www.python-forum.de/viewtopic.php?t=2552

oder?

Dabei wird eigentlich keine Grafik erzeugt. Es wird mit Text-Punkten, z.B.: can.create_text(x,y,fill='black',text='.') gearbeitet. Das über TKinter, ist sehr lahm... Die eigentliche Berechnung ist wesendlich schneller!
Normalerweise ist er bei mir (SIZE = 100) in ca. 24Sec fertig. Wenn man den ganzen IF-Block auskommentiert in dem der Punkt gezeichnet wird, ist er schon in 0.35Sec fertig!

In unserer Python-FAQ findest du übrigends für den Einstieg einige Informationen: http://www.pythonwiki.de/PythonDeForum/Faq

Danke

Verfasst: Sonntag 21. August 2005, 18:15
von Tester
Vielen Dank für Eure Tips!

Aha -- mit 0.35s sieht das natürlich schon gaaaanz anders aus...

Was meint Ihr so zur Zukunft von Python ?
Wird sich Python wohl gegen PERL und Ruby durchsetzen und auch in einigen Jahren noch aktuell sein ?
Zu wünschen wäre das ja.
Grüße

Verfasst: Sonntag 21. August 2005, 18:45
von henning
Ins blaue geraten würd ich sagen: ja.
Der Hauptgrund für diese Behauptung ist, dass Python
eine --finde ich-- wesentlich intuitivere Syntax und struktur bietet.
Auch wenn ruby coole features hat, man muss sich da erstmal sehr hineindenken.
Von PERL-Code, den ich zuweilen kaum von Binarys unterscheiden kann ganz zu schweigen ;-)

Wobei es erfahrungsgemäß nicht so sein wird, dass PERL oder Ruby verschwinden werden. Eigentlich wächst die Zahl der Programmiersprachen ja ständig, was in mancherlei Hinsicht auch wieder schade ist :-/

Verfasst: Sonntag 21. August 2005, 18:55
von mawe
Hi!

@jens: 0.35s? Zeigst Du bitte mal den Code mit dem Du das erreichst.

Zum speed allgemein:
Python ist eine Scriptsprache und damit zwangsweise langsamer als compilierte Sprachen. Andererseits gibt's für heftiges number crunching ja so nette Module wie Numeric, numarray, SciPy, ... die für einen gehörigen Performanceschub sorgen :) Es ist eigentlich auch kein Problem die performancekritischen Teile eines Programms in C oder Fortran zu schreiben und in das Programm einzubinden.

Zur Zukunft: Kann man die in der IT-Welt überhaupt halbwegs sinnvoll vorrausagen?
Welche Sprache sich durchsetzen wird, hängt zu einem grossen Teil von der dahinterstehenden Community ab. Was wäre z.B. Perl ohne CPAN? Perl 6 kommt ja auch bald raus (ha, der war gut :)). Mal sehn wie das wird.
Python und Ruby sind derzeit in aller Munde. Für mich hat Python klar die Nase vorn, weils schon länger da und viel weiter verbreitet ist. Die Gründe von Python zu Ruby zu wechseln sind nicht wirklich so gravierend (wenn überhaupt vorhanden) wie z.B. von Perl zu Python. Module wie die von mir oben genannten gibt's in Ruby z.B. gar nicht.

Gruß, mawe

Verfasst: Sonntag 21. August 2005, 19:50
von Clython
Kommt noch hinzu, dass der Perl-Vater (Wall oder so?) jetzt ein ähnliches Konzept brauchen will wie Java, eine virtual Machine und das auf die länge diese Machine (genannt Parrot), dann auch Python und Ruby Code ausführen können soll. Es ist also anzunehmen, dass sich die Perl und die Python Welt noch weiter nähern werden.

Verfasst: Montag 22. August 2005, 06:31
von jens
mawe hat geschrieben:@jens: 0.35s? Zeigst Du bitte mal den Code mit dem Du das erreichst.
Wie gesagt, ich hab nur den ganzen IF-Block auskommentiert:

Code: Alles auswählen

from Tkinter import *

import time
StartTime = time.time()

SIZE = 100
LEFT = -2
RIGHT = 0.5
TOP = 1.25
BOTTOM = -1.25
ITERATIONS = 20

root = Tk()
can = Canvas(width=SIZE,height=SIZE)
can.pack()

for y in range(SIZE):
    for x in range(SIZE):
        z = complex(0,0)
        c = complex(LEFT+x*(RIGHT-LEFT)/SIZE, TOP+y*(BOTTOM-TOP)/SIZE)
        norm = abs(z)**2
        for count in range(ITERATIONS):
            if norm <= 4.0:
                #z = complex(z.real*z.real - z.imag*z.imag + c.real, z.imag*z.real*2+c.imag)
                z=z*z+c
                #norm = abs(z)**2
                norm=abs(z*z)
            else:
                break
        #~ if count<=4:
            #~ can.create_text(x,y,fill='grey',text='.')
        #~ elif count<=8:
            #~ can.create_text(x,y,fill='green',text='.')
        #~ elif count<=10:
            #~ can.create_text(x,y,fill='blue',text='.')
        #~ elif count<=12:
            #~ can.create_text(x,y,fill='red',text='.')
        #~ elif count<=15:
            #~ can.create_text(x,y,fill='yellow',text='.')
        #~ else:
            #~ can.create_text(x,y,fill='black',text='.')

        root.update()

print "Dauer:",time.time()-StartTime

root.mainloop()
Zur Zukunft: Ich denke nicht das Python irgendwann sterben wird. Es steckt halt keine Firma hinter dem ganzen, die irgendwann vielleicht Pleite ist und die Software verschwindet. Es ist OpenSource...
Gegenüber den neuen wie Ruby, hat Python klar die Nase vorn! Das zeigt sich auch bei den Webserver. Python ist viel öfter per CGI dabei als Ruby! Außerdem ist Python unter Linux immer wichtiger geworden. Einige Essenstielle Programme sind in Python realisiert.
Für die Verbreitung spricht außerdem die gute Verfügbarkeit von fertigen Module für alle möglichen Bereiche...

re

Verfasst: Montag 22. August 2005, 20:53
von Tester
Ja, Ruby scheint international (noch?) keine große Rolle zu spielen, obwohl
Ruby in Japan ja sehr beliebt sein soll.


Ich habe mir auf der Suche nach einer Alternative zu den üblichen mir bekannten Standard-Sprachen zwecks "Rapid Prototyping" von kleinen bis mittleren Projekten eine ganze Reihe von Sprachen angesehen und ausprobiert, darunter (C,X)LISP(STAT),Scheme,Poly,ML,FORTH, APL, Javascript, Haskell, PERL, Python und eine Reihe kleinerer Sprachen;
letztendlich scheint mir Python im Großen und Ganzen das eleganteste und modernste Konzept zu sein, zumal man mit Python offensichtlich wahlweise prozedural, OO oder (in Grenzen) funktional programmieren kann -- alle
anderen Sprachen in der obigen Liste können nur einen oder zwei dieser 3 Programmierstile unterstützen.

Wenn ich mir nun ansehe, was Python implizit alles an Arbeit
für den Programmierer erledigt, dann ist es geradezu erstaunlich, wieviel
von dieser Arbeit bei anderen modernen Sprachen dem Programmierer aufgelastet
wird: C++ hat keine Garbage-Collection und man ist unter anderem noch selbst für den Copy-Constructor bei der "by value"-Argumentübergabe von Objekten bei Funktionsaufrufen verantwortlich. Warnung bei
nicht--initialisierten Variablen und Zeigern bei C++ ? Fehlanzeige.
Dafür gleich zwei verschiedene Methoden der "by reference"-Argumentübergabe (Zeiger und Referenzen)...
Hätte ich Python schon vor ein paar Jahren kennengelernt, dann hätte ich
mein letztes Projekt nicht in C++ durchgeführt, schätze ich mal :)


Na dann will ich ernsthaft hoffen, daß Python seine beste Zeit noch vor sich hat und nicht im "Neue-Programmiersprachen"-Trubel dieser Jahre verloren
geht.

Verfasst: Montag 22. August 2005, 21:07
von mawe
Hi!

Ich will Dich keineswegs von Python abhalten (ganz im Gegenteil :)), aber schau Dir doch mal OCaml an. Es unterstützt die 3 von Dir erwähnten Programmierstile und bringt auch noch eine beachtliche Performance mit.

Gruß, mawe

Verfasst: Dienstag 23. August 2005, 08:42
von henning
Wenn wir schon so aus dem Topic entgleiten möchte ich auch gern nochmal Werbung für Dylan machen.
Das tolle an Dylan ist kurz gesagt: Man kann sowohl statisch typisieren (Also Typen von Variablen festlegen wie in C ==> Performance) oder dynamisch wie in Python (Also jede Variable kann Daten von jedem Typ annehmen).

Die Fälle lassen sich beliebig mischen und man kann den Code über C direkt zu binarys compilen die Geschwindigkeitsmäßig wohl mit C++ vergleichbar sind oder auch interpretieren.

http://www.gwydiondylan.org

Verfasst: Dienstag 23. August 2005, 09:28
von jens
Also da möchte ich gleich normal Werbung für Python machen, denn alle genannten Sprachen sind IMHO keine alternative für Python! Mit welcher kann man CGIs schreiben? Natürlich kann man theoretisch mit complilierten Binaries arbeiten, aber wenn man bei billigen Webspace Providern bleibt, dann führt kein weg an PHP oder Python vorbei. Nur mit Python kann man allerdings auch "normale" Programme realisieren...

Verfasst: Dienstag 23. August 2005, 09:45
von henning
Ganz ruhig :-)
Ich hab ja nie behauptet dass Dylan unersetzbar ist.
Für verschiedene Zwecke sind halt verschiedene Sprachen geeignet
auch wen Python für sehr sehr viele Zwecke geeignet zu sein scheint.

Dylan ist halt cool, wenn man ein Projekt baut, später merkt dass es immer größer wird, dann braucht man halt keinen C Code auszulagern sondern nur ein paar Typen festlegen und man holt ganz schnell performance raus.

Ich persönlich werde aber mittelfristig auch bei Python bleiben, zumal Dylan auch leider noch nicht so ausgereift ist.
(Und mir Python-Code auch wesentlich lesbarer erscheint als der von Gwydion-Dylan)

re

Verfasst: Dienstag 23. August 2005, 10:19
von Tester
@Mawe:
danke für den Hinweis; nein, OCAML habe ich bislang nicht ausprobiert.
Von den Funktionalen Sprachen habe ich mir vor allem Haskell näher
angesehen; dessen Mathematik-ähnliche Notationen mit Abbildungspfeilen
und Mengeschreibweise finde ich zwar hübsch, aber die funktionelle
Denkweise ist mir irgendwie zu fremd, als daß ich in so einer Sprache
effizient programmieren könnte oder wollte. Ist wahrscheinlich auch eine
Frage der Übung.
Und LISP und Verwandte haben mir einfach zuviele runde Klammern, daneben
scheint es in der LISP-Welt etliche inkompatible Dialekte zu geben, sodaß
man nie Gewissheit hat, ob man dieses oder jene XLISP-Programm auch unter Common LISP zum Laufen bringen kann.
In allen diesen Hinsichten gefällt mir vorerst Python besser.

Und daß bei Python GUI-Module gleich mitgeliefert werden, die
plattformunabhängig sind und auch noch auf Anhieb laufen... daß man das noch mal bei einer Programmiersprache erleben darf...
schätze, ich bin ein bischen C/C++-"geschädigt". Bei solchen Sprachen
ist es nämlich meiner Erfahrung nach eher die Ausnahme, daß ein Quelltext A, der umfangreicher als eine kleine Konsolenanwendung ist, mit einem Compiler B läuft, Standard hin oder her. Von portablem GUI ganz zu schweigen.

Verfasst: Dienstag 23. August 2005, 10:38
von mawe
Hi!
jens hat geschrieben: Also da möchte ich gleich normal Werbung für Python machen
:) brauchst Du nicht, wir wissen alle dass Python cool ist :)
jens hat geschrieben: denn alle genannten Sprachen sind IMHO keine alternative für Python!
Wirklich? So toll Python auch ist, es ist nicht die geeignetste Sprache für alles. Und ein wenig über den Tellerrand schauen hat noch niemandem geschadet :)
jens hat geschrieben: Mit welcher kann man CGIs schreiben?
Mit jeder.
aber wenn man bei billigen Webspace Providern bleibt, dann führt kein weg an PHP oder Python vorbei.
Das ist natürlich ein Argument, aber ...
jens hat geschrieben: Nur mit Python kann man allerdings auch "normale" Programme realisieren...
... ist das auch ein Argument? :) Was sind "normale" Programme?

Zu Dylan muss ich sagen, dass ich schon viel Gutes darüber gehört habe, habs mir allerdings nur kurz angesehen. Die Syntax hat mich mal völlig abgeschreckt (ist aber anfangs bei fast jeder Sprache so), und besonders verbreitet scheint Dylan auch nicht zu sein (noch zu kleine Community?).

Bei OCaml gefallen mir halt einige Dinge:
- Ich kann funktional, prozedural und OO programmieren (ähnliches gilt für Python)
- die Performance ist beeindruckend
- wenn ich mal kurz was ausprobieren will, tippe ich auf der Kommandozeile ocaml und bin im interaktiven Modus (wie bei Python)
- Es gibt einen Interpreter, d.h. ich kann mein Programm einfach mit ocaml myprogram.ml ausführen.
- Ich will plattformunabhängigen Bytecode: ocamlc myprogram.ml
- Ich will native code: ocamlopt myprogram.ml

Naja, wie auch immer. Python ist meine Lieblingssprache und wird es wahrscheinlich auch bleiben. Aber wie schon vorhin gesagt, es ist nicht die geeignetste Sprache für jeden Zweck.

Gruß, mawe

Verfasst: Dienstag 23. August 2005, 10:46
von mawe
Tester hat geschrieben: aber die funktionelle Denkweise ist mir irgendwie zu fremd, als daß ich in so einer Sprache effizient programmieren könnte oder wollte. Ist wahrscheinlich auch eine Frage der Übung.
Ich finde gerade wenn Du von C/C++ und Konsorten kommst, solltest Du Dir mal eine funktionale Programmiersprache ansehen (natürlich SOLLST Du Dir auch Python ansehen :)).

Zu Lisp und den Klammern sag ich nur: Mit einem guten Editor ist das überhaupt kein Problem :)

Verfasst: Dienstag 23. August 2005, 15:22
von henning
Hmm dieses ocaml hört sich ja langsam echt interessant an, werd ich auch mal ein Auge drauf haben.
Was sind da so typische Einsatzgebiete?

Zu Dylan: Die Syntax ist ein bisschen gewöhnungsbedürftig und auch nicht so übersichtlich wie die in Python, aber in der Mailinglist zur Zeit noch in der Diskussion (so wollen viele LISP-artige Syntax).
Aber wenn man sich mal dran gewöhnt hat, scheint sie auch nicht
so wirklich unlogisch.