Seite 1 von 1

Schnellere Quersummen Funktion

Verfasst: Mittwoch 30. August 2017, 13:59
von eject
Grüßt euch zusammen,

so nach einiger Zeit belästige ich euch nun wieder. Habe Python nach Ewigkeiten wieder mal angefasst und mir eine Funktion geschrieben, die mir die Quersumme aus gegebenem Parameter zurückgibt.

==>

Code: Alles auswählen

def getQuersumme( _int ):
    
    iFinal = 0

    for i in str( _int ):

        iFinal += int( i )
    
    return iFinal
Geht das Ganze nicht schneller ? Ihr habt wohl mehr Erfahrung in Python als ich, wäre nett wenn n' Vorschlag kommen würde.

Grüße,
eject.

Re: Schnellere Quersummen Funktion

Verfasst: Mittwoch 30. August 2017, 14:09
von BlackJack
@eject: Man kann es kompakter schreiben, aber wirklich schneller würde ich sagen, geht das nicht wirklich. Warum überhaupt? Ist Dir das zu langsam?

Man könnte sich an die Namenskonventionen halten. Und keine komischen (Typ?)Präfixe bei Namen verwenden. `get*` passt auch nicht wirklich, denn die Quersumme wird nicht von irgendwo her geholt, sondern berechnet. Deutsch und Englisch im gleichen Namen zu mischen ist auch unschön.

Code: Alles auswählen

def berechne_quersumme(wert):
    rerurn sum(map(int, str(wert)))

Re: Schnellere Quersummen Funktion

Verfasst: Mittwoch 30. August 2017, 14:16
von eject
@BlackJack , perfekt sowas wie map hat mir gefehlt. Wusste nicht, dass es sowas praktisches in Python gibt. ^^

Die Variablenbezeichnung habe ich mir ein bisschen angewöhnt, sorry war Gewohnheit. Und "get" habe ich gleichgestellt mit berechne, da ja die Quersumme - wie du sagst - berechnet wird und zurückgegeben wird. Habe ja kein Pointer/ Zeiger der genommen wird.

Und drauf gekommen bin ich, da ich in C und C++ Benchmarks von Funktionen gemacht habe und die möglichst laufzeiteffizient bzw. schnell haben will. Und weil ich auch wissen wollte wie sowas in Python aussieht habe ich mich halt Spaßeshalber drangesetzt, man lernt ja nie aus wie man sieht.

Also, vielen Dank für deine Lösung! :) Wünsche einen angenehmen Mittwoch Nachmittag.

Grüße,
eject.

Re: Schnellere Quersummen Funktion

Verfasst: Mittwoch 30. August 2017, 14:22
von BlackJack
@eject: Von so etwas benchmarks zu machen ist verlorene Zeit, das macht keinen Sinn. Weder in C oder C++ oder in Python. Man will in aller Regel auch keine Funktionen möglichst schnell haben, sondern sie lesbar, verständlich, und schnell genug haben. Wenn das Programm dann nicht schnell genug ist, misst man erst einmal wo überhaupt der Flaschenhals liegt, damit man an der richtigen Stelle ansetzen kann.

`get` kann man nicht wirklich mit berechnen gleichsetzen. Das wäre in dem Fall eine dieser Vorsilben wo sich der Programmierer keine Gedanken über einen sinnvollen Namen machen wollte.

Re: Schnellere Quersummen Funktion

Verfasst: Mittwoch 30. August 2017, 14:29
von eject
@BlackJack Ich versuche im Moment so schnell wie möglich unterwegs zu sein. Die Benchmarks sind nur aus Interesse entstanden und weil ich nebenbei am benchmarken von Assembly war. Ich stimme dir vollkommen zu, dass Sauberkeit und Verständlichkeit zu dem Style eines guten Programmierers gehören, allerdings ist dies nicht immer möglich. Das wirklich Wichtige sollte man kommentieren, aber bei Aufgaben welche sauber und minimal gehalten wurden finde ich, dass man es durchaus mal weglassen kann. Und zu "get" klar, eigentlich müsste ich n Alias für "Quersumme" erstellen, damit es Sinn machen würde. Eher würde sowas wie calcQuersumme Sinn machen, da hast du Recht!

In dem Sinne.

Grüße,
eject.

Re: Schnellere Quersummen Funktion

Verfasst: Mittwoch 30. August 2017, 15:17
von BlackJack
@eject: Es ist halt nicht möglich bei so etwas so schnell wie möglich zu sein, denn das hängt bei Sprachen wie Python davon ab wie die Sachen implementiert sind. Und bei Maschinensprache auf was für einer Hardware das am Ende konkret läuft. Ich denke Du gibst Dich da Illusionen hin. Und verplemperst deutlich mehr Zeit als man je durch die Programmierung wieder einsparen könnte, für Programme die *vielleicht* und unter bestimmten Bedingungen schneller sind als wenn man das einfach nur ganz normal implementiert hätte ohne sich Gedanken um irgendwelche Mikrooptimierungen zu machen.

Wenn man in Python bei so etwas wegen Geschwindigkeit anfängt Code zu schreiben der nicht offensichtlich ist, dann will man kein Python verwenden, sondern das in einer anderen Sprache schreiben.

Re: Schnellere Quersummen Funktion

Verfasst: Dienstag 5. September 2017, 20:28
von bb1898
Lohnender und spaßiger ist es natürlich, verschiedene Algorithmen für dasselbe Problem zu vergleichen. Leider ist meine Alternative die langsamere, wenn ich beim Messen nichts falsch gemacht habe:

Code: Alles auswählen

def berechne_quersumme(wert):
    quersumme = 0
    while wert:
        (wert, ziffer) = divmod(wert, 10)
        quersumme += ziffer
    return quersumme
Also kein Hin und Her zwischen Zahl und String, dafür so viele Divisionen wie die Ausgangszahl Stellen hat. Und das scheint aufwendiger zu sein.

Randbemerkung: in einer Funktion dieser Länge hätte ich normalerweise die Variablennamen w, q und z verwendet.

Re: Schnellere Quersummen Funktion

Verfasst: Dienstag 5. September 2017, 20:44
von snafu
Über str() würde ich auch nicht gehen. Ich würd's so machen:

Code: Alles auswählen

def get_digit_sum(n):
    result = 0
    while n:
        result += n % 10
        n //= 10
    return result