add() usw. aus Modul operator schneller als z.B. a+b

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.
Antworten
hulkhomer
User
Beiträge: 17
Registriert: Samstag 14. Juni 2014, 09:06

Hallo!

Ich hab die Suche bemüht aber leider konnte mir die (wie google auch) keine Antwort liefern.

Ich frage mich, welche Vorteile die operatoren aus dem Modul gegenüber den "normalen" haben.

Merkt man einen Geschwindigkeitsvorteil oder sind die einfach besserer Stil?

Danke schonmal!
BlackJack

@hulkhomer: Das ist weder eine Geschwindigkeits- noch eine Stilfrage sondern das man manchmal eine Funktion brauchen kann die den gleichen Effekt wie ein Operator hat. Und einige Funktionen machen/können auch etwas mehr als der entsprechende Operator.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Um BlackJack zu ergänzen, wenn du irgendeine Funktion aus operator direkt aufrufst, hast du was falsch gemacht.
hulkhomer
User
Beiträge: 17
Registriert: Samstag 14. Juni 2014, 09:06

DasIch hat geschrieben:Um BlackJack zu ergänzen, wenn du irgendeine Funktion aus operator direkt aufrufst, hast du was falsch gemacht.
Wie meinst du das?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@hulkhomer: Würdest du so programmieren wollen:

Code: Alles auswählen

from operator import mul, add, sub, mod

a = mod(mul(b, c), add(mul(d, e), sub(mul(f, g), h)))
?
Oder doch lieber so:

Code: Alles auswählen

a = (b * c) % (d * e + f * g - h)
Die Funktionen aus dem operator Modul kann man verwenden, wenn man zB. sowas macht:

Code: Alles auswählen

def foldl(binary_function, iterable):
    iterable = iter(iterable)
    result = next(iterable)
    for each in items:
        result = binary_function(result, each)
    return result

items = [1, 2, 3, 4, 5, 6, 7]
foldl(mul, items)
Ergebnis:foldl() gibt es auch in der Python Standardlib, nur dass es da reduce() heißt und einen zusätzlichen, optionalen start-Parameter nimmt:

Code: Alles auswählen

>>> reduce(mul, items)
5040
>>> reduce(mul, items, 10)
50400
Ab Python 3 muss man es aus functools importieren.

Und noch das hier zum Vergleich:

Code: Alles auswählen

>>> reduce(*, items)
  File "<stdin>", line 1
    reduce(*, items)
            ^
SyntaxError: invalid syntax
In specifications, Murphy's Law supersedes Ohm's.
hulkhomer
User
Beiträge: 17
Registriert: Samstag 14. Juni 2014, 09:06

Danke erstmal für die ausführliche Antwort!

Natürlich finde ich a+b auch praktischer, bei z.B. add() ist halt zum Beispiel die Möglichkeit praktisch, ein Tupel gleich zu addieren, ohne for in.

Ich bin ein ziemlicher Anfänger und will mir gleich zu Beginn einen (einigermaßen) sauberen Stil angewöhnen. Und weil mein Rechner eine ziemliche Krücke ist, bin ich immer froh, wenn ich Sachen schneller rechnen lassen kann :D
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

hulkhomer hat geschrieben:... ein Tupel gleich zu addieren, ohne for in.
Das macht man mit sum():

Code: Alles auswählen

>>> tup = 2, 4, 6
>>> tup
(2, 4, 6)
>>> sum(tup)
12
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

hulkhomer hat geschrieben:Und weil mein Rechner eine ziemliche Krücke ist, bin ich immer froh, wenn ich Sachen schneller rechnen lassen kann :D
Wenn du wissen willst wie schnell etwas ist, dann hilft nur Messen. Selbst dann ist aber nicht gesagt, dass die schnellere Methode in wirklichen allen Python-Laufzeitumgebungen grundsätzlich schneller ist.

So lange du nicht wirklich ernsthafte Performance-Probleme hast solltest du Code nicht auf vermeintlichen Geschwindigkeitsgewinn hin optimieren.
BlackJack

@hulkhomer: Als Zusatz zu /me's Beitrag: Wenn optimieren dann nicht mit solchen Kleinigkeiten sondern eher Algorithmisch schauen ob man das nicht besser hinbekommt. Falls nicht, dann die zeitkritischen Teile in C programmieren und mit `ctypes` einbinden oder Cython verwenden.
Antworten