Seite 1 von 1

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

Verfasst: Sonntag 5. Oktober 2014, 22:02
von hulkhomer
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!

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

Verfasst: Sonntag 5. Oktober 2014, 22:09
von 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.

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

Verfasst: Sonntag 5. Oktober 2014, 22:18
von DasIch
Um BlackJack zu ergänzen, wenn du irgendeine Funktion aus operator direkt aufrufst, hast du was falsch gemacht.

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

Verfasst: Sonntag 5. Oktober 2014, 22:31
von hulkhomer
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?

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

Verfasst: Sonntag 5. Oktober 2014, 22:56
von pillmuncher
@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

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

Verfasst: Montag 6. Oktober 2014, 18:39
von hulkhomer
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

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

Verfasst: Montag 6. Oktober 2014, 19:22
von pillmuncher
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

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

Verfasst: Montag 6. Oktober 2014, 21:05
von /me
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.

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

Verfasst: Montag 6. Oktober 2014, 21:34
von 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.