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.
Inwiefern ist das nun "besser"? Mathematischer ist das natürlich, aber ist es wirklich performanter als die Typumwandlung? Oder gibt es tatsächlich Fälle, in denen len(str(n)) ein falsches Ergebnis liefert..?
I am not part of the allesburner. I am the [url=http://allesburner.de]allesburner[/url].
@Redprince: Es ist IMHO eleganter die Anzahl der Stellen auszurechnen, und nicht eine Zeichenkette anzulegen, nur um deren Länge abzufragen und dann wieder wegzuwerfen. Ab einer bestimmten Grösse ist es spürbar schneller.
Redprince hat geschrieben:Inwiefern ist das nun "besser"? Mathematischer ist das natürlich, aber ist es wirklich performanter als die Typumwandlung? Oder gibt es tatsächlich Fälle, in denen len(str(n)) ein falsches Ergebnis liefert..?
long->str ist ab einer gewissen Länge nicht mehr vernachlässigbar langsamer als „mathematische“ Methode. Da ist irgendwo der Wurm drin, der Rechenaufwand steigt jedenfalls nicht linear mit der Anzahl der Stellen. Wobei die, wie man in Numerix Beispiel sieht, mit gewissen Rundungsfehlern behaftet ist.
Zuletzt geändert von Darii am Montag 12. Oktober 2009, 21:56, insgesamt 1-mal geändert.
Ich weiß aber leider nicht, wie man das global-Statement vermeiden kann (das ist ja sowas von superböse ). Der einzige Weg, der mir eingefallen ist, ist ein Keyword-Argument mit dem Startwert 1 in der Funktion zu benutzen. Das macht aber keinen Sinn, weil man nie einen anderen Startwert als 1 haben möchte.
Man könnte die Klammern auch weglassen und die 0 durch eine 1 ersetzen, das macht es aber nicht gerade übersichtlich. Bei der Division musst du ggf. // verwenden.
Alternativ zu den obgien (für dieses Problem schöneren) Lösungen hättest du auch eine innere Funktion nutzen können, dann hat die Funktion keine Abhängigkeiten im globalen Namensraum mehr und "num_of_digits" bliebe "Implementationsdetail":
Function-Calls sind durch den Kontext-Wechsel vergleichsweise teuer. Iterative Lösungen sind eigentlich immer der Rekursiven vor zu ziehen. Das spart Stack-Bewegungen und Speicher und lässt sich vom Compiler auch einfacher optimieren.
Im ersten Teil des Threads wurde der Aspekt "Geschwindigkeit" erwähnt ...
In der Praxis dürfte die log-Variante dennoch die günstigste sein, man muss halt zu der +1 noch einen "kleinen" Wert beigeben, um auf der (einigermaßen) sicheren Seite zu sein.