2016-11-19 2 views
1

Ich würde gerne verstehen, warum ich die Geschwindigkeitsunterschiede, die ich sehe, wenn ich Funktionen auf verschiedene Arten komponieren. Ich bin hauptsächlich daran interessiert zu verstehen, warum Fall (1) schneller ist als Fall (2).Python Geschwindigkeit komponierte Funktionen

Danke!

import math 
from time import time 

def f(x): 
    return 2*x 
def g(x): 
    return x*x 
def h(x): 
    return math.sqrt(x) 

time0 = time() 
for x in range(1,10**7): 
    x_ = h(g(f(x))) 
print 'h(g(f(x))): {}'.format(time() - time0) 

def fgh(x): 
    return h(g(f(x))) 
time0 = time() 
for x in range(1,10**7): 
    x_ = fgh(x) 
print 'composed: {}'.format(time() - time0) 

time0 = time() 
for x in range(1,10**7): 
    x_ = f(x) 
    x__ = g(x_) 
    x___ = h(x__) 
print 'subsequent: {}'.format(time() - time0) 

Als Runtimes, erhalte ich:

h(g(f(x))): 2.83475399017 
composed: 3.29999113083 
subsequent: 3.4387819767 

Antwort

1

Für den Anfang Fall 2 hat einen weiteren Anruf - das von fgh(x), während im Fall 1 Sie h(g(f(x))) sind direkt aufrufen. Innerhalb einer engen Schleife, die viele Male ausgeführt wird, kann dieser zusätzliche Funktionsaufruf zusätzliche Ausführungszeit hinzufügen. Fall 1 In-Linien, die anrufen, also ist es ein bisschen schneller. Fall 3 macht einige zusätzliche Aufgaben und lädt Variablen, was erklärt, warum es langsamer ist.

+0

OK, ich dachte so etwas. Ist es fair zu sagen, dass, wenn jede der komponierten Funktionen komplexer und zeitintensiver ist, es für die Laufzeit keine Rolle spielt, wie ich sie komponiere? (d. h. der zusätzliche Funktionsaufruf in Beispiel 2 wird vernachlässigbar) – Aplln

+0

Für den allgemeinen Fall hängt dies von der Funktion ab - es kann Situationen geben, in denen die Zusammensetzungsreihenfolge wichtig ist (zum Beispiel: wenn die Multiplikation großer Matrizen zusammengesetzt wird). Für Ihr Beispiel ist es vielleicht nicht so wichtig, aber man kann davon ausgehen, dass Operationen wie das Nehmen der Quadratwurzel für größere Zahlen langsamer sind, also wird es etwas langsamer sein, wenn wir es für das Ende belassen –

Verwandte Themen