2016-11-19 10 views
1

私は異なる方法で関数を作成するときに表示される速度の違いを理解する理由を理解したいと思います。 私は、case(1)がcase(2)より高速である理由を理解することにほとんど関心があります。python速度合成関数

ありがとうございます!

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) 

はランタイムとして、私は得る:手始めに

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

答えて

1

は、ケース2は、1回の余分呼び出している - ケース1には、あなたが直接h(g(f(x)))を呼んでいるのに対し、fgh(x)のことを。何度も実行されるタイトなループの中で、その追加の関数呼び出しは余分な実行時間を追加する可能性があります。ケース1のインラインで呼び出すので、少し速いです。ケース3は余分な割り当てと読み込み変数を実行しているため、なぜそれが遅いのかがわかります。

+0

OK、私はそういうことを考えました。合成された関数のそれぞれがより複雑で時間のかかるものであれば、それらをどのように構成するのかは実行時には関係ありません。 (例2の追加の関数呼び出しは無視できる程度になります) – Aplln

+0

一般的なケースでは、関数に依存します - 合成順序が重要な状況があるかもしれません(例えば:大きな行列の乗算を構成する場合)。あなたの例ではそれほど重要ではないかもしれませんが、平方根を取るなどの操作はより大きい数値の方が遅くなると想定できるので、最後に残すと少し遅くなります –