Schnellere Quersummen Funktion

Code-Stücke können hier veröffentlicht werden.
Antworten
eject
User
Beiträge: 10
Registriert: Freitag 8. Januar 2016, 22:39

Mittwoch 30. August 2017, 13:59

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.
Zuletzt geändert von Anonymous am Mittwoch 30. August 2017, 14:05, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Mittwoch 30. August 2017, 14:09

@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)))
eject
User
Beiträge: 10
Registriert: Freitag 8. Januar 2016, 22:39

Mittwoch 30. August 2017, 14:16

@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.
BlackJack

Mittwoch 30. August 2017, 14:22

@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.
eject
User
Beiträge: 10
Registriert: Freitag 8. Januar 2016, 22:39

Mittwoch 30. August 2017, 14:29

@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.
BlackJack

Mittwoch 30. August 2017, 15:17

@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.
bb1898
User
Beiträge: 130
Registriert: Mittwoch 12. Juli 2006, 14:28

Dienstag 5. September 2017, 20:28

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.
Benutzeravatar
snafu
User
Beiträge: 5461
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 5. September 2017, 20:44

Ü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
shcol (Repo | Doc | PyPi)
Antworten