Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > ger.ct > #617101

Langsamkeit von Python (was: Re: Weißes Haus warnt vor C++)

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>

Show all headers | View raw


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