Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| From | ram@zedat.fu-berlin.de (Stefan Ram) |
|---|---|
| Newsgroups | ger.ct |
| Subject | Langsamkeit von Python (was: Re: Weißes Haus warnt vor C++) |
| Date | 2024-03-06 09:34 +0000 |
| Organization | Stefan Ram |
| Message-ID | <langsam-20240306102817@ram.dialup.fu-berlin.de> (permalink) |
| References | (1 earlier) <us3rvr$tvf4$2@solani.org> <us6nh1$uuqq$5@solani.org> <l4o71fFbivgU1@mid.individual.net> <us90kt$10jn4$2@solani.org> <l4qqutFnrdkU1@mid.individual.net> |
Hermann Riemann <nospam.ng@hermann-riemann.de> schrieb oder zitierte:
>Bei 50 Parzellen könnte Python reichen,
>bei 50000 nicht. Python ist ca 30 mal langsamer als in
>Maschinensprache übersetzte Programme.
Hier gerade erlebt:
Ich habe verschachtelte Schleifen in Python um zu sehen, ob ein Name
aus einer Reihung einem Namen aus einer anderen Reihung gleicht:
for to_name in to_names:
for from_name in from_names:
if from_name == to_name: error()
Dann folgt noch eine anderen Schleife, um zu sehen, ob ein Name in
einer Reihung mehrfach vorkommt
for i, to_name in enumerate( to_names ):
for i_, to_name_ in enumerate( to_names ):
if i != i_:
if to_name == to_name_: error()
. Bei Tests zeigte sich, daß diese Schleifen bei großen
Reihungen sehr viel Zeit brauchen. Python ist langsam, und
die verschachtelten Schleifen haben quadratische Laufzeit (O(n^2))!
Nun kann man in Python aber beide Schleifen so umschreiben,
daß sie lesbarer und schneller sind, weil man dann nur noch
Bibliotheksfunktionen aufruft, die in C geschrieben wurden,
und effiziente Algorithmen verwenden:
if set( to_names ).intersection( set( from_names )): error()
if len( to_names )> len( set( to_names )): error()
. Das heißt: Es gibt einen from-Namen, der einem to-Namen
gleicht, sobald die Schnittmenge der Menge der from-Namen und der
Menge der to-Namen nicht leer ist. Und es gibt mindestens einen
Namen, der doppelt in der Reihung der to-Namen vorkommt, wenn
die Reihung mehr Einträge enthält als die daraus gewonnene Menge.
Wenn ein Name doppelt vorkommt, wollte ich außerdem noch
wissen, welcher Name das ist, und an welcher Position er
vorkommt. Im ersten Fall liefert "intersection" gleich die
Namen, deren Position sich dann mit einer O(n)-Schleifen finden
läßt. Im zweiten Fall können verschachtelte Python-Schleifen
durch "Counter" ersetzt werden: "collections.Counter ( array )"
findet alle mehrfachen Einträge in einer Reihung.
Während man bei der Ausführung der Schleifen das Gefühl
hatte, das Programm sei abgestürzt, weil es nicht mehr
weiterläuft, sind die neuen mengenbasiertes Tests so schnell,
daß sie keine wahrnehmbare Laufzeit mehr benötigen.
Das heißt: Wenn man sich mit einigen Techniken vertraut macht,
dann kann man bestimmte Dinge so schreiben, daß die Langsamkeit
von Python umgangen wird.
Back to ger.ct | Previous | Next | Find similar | Unroll thread
csiph-web