1

次のコードがあるとします。

qwe = 1.5    

def jkl(l):
    result = 2*(math.pi/l)
    return result

def asd(b, l):
    result = (abs(((jkl(l)**2)*(qwe**2))-(b**2))**(0.5)
    return result

asd def にその長い式を含める方が効率的ですか、それとも分解した場合はより速く計算されますか?

def asd(b, l):
    z1=jkl(l)**2
    z2=qwe**2
    z3=b**2
    z4=(z1*z2)-z3
    z5=abs(z4)
    z6=z5**(0.5)
    return z6

私のコードはサードパーティによって使用および変更される可能性があるため、分解された例は簡単に理解できますが、これらすべての関数内変数を作成すると、すべてを 1 行で実行するよりも遅くなりますか? その関数は、さらに複雑な他の関数によって何百回も呼び出されるため、できるだけ高速である必要があります。

4

2 に答える 2

4

測定せずに見分ける方法はありません。幸いなことに、Pythonにはまさにそれを行うモジュールが付属しています。timeit

両方の関数を実行するだけで、どちらtimeit.timeit()が速いかがわかります。

私の直感は、コンパクトな1行のフォームの方が速いということですが、間違っている可能性があります。

2*math.piそして、定数に置き換えたいと思うかもしれませんPI2

PI2 = 2*math.pi
def jkl(l): return PI2 / l

関数呼び出しはコストがかかるため、このコードをにインライン化する必要がありますasd()

PS:実際のコードの関数名がもっと読みやすくなることを願っています。:-)asd()誰かのコードを見ると、強い怒りを覚えます。:-)

于 2012-11-16T09:47:54.510 に答える
1

多くの人が python のtimeitモジュールを使用して速度をテストすることを提案しています。

print timeit.timeit('asd(2,2)','from __main__ import asd')
print timeit.timeit('asd_split(2,2)','from __main__ import asd_split')

>>>0.93675494194
>>>1.0719628334

予想通り、分割されていないバージョンの方が高速なようです。

于 2012-11-16T10:02:52.907 に答える