0

以下は私の関数定義です

def func_a():
    return 1

def func_b(val1):
    return val1*2

そして、これは関数を呼び出す 1 つの方法です。

count = 0
while count < 10000000:    
    val2 = func_b(func_a())
    count += 1

上記の所要時間は次のとおりです。

real    0m5.003s
user    0m4.989s
sys 0m0.012s

同じ関数定義を使用した以下の使用法:

count = 0
while count < 10000000:    
    ret1 = func_a()
    val2 = func_b(ret1)
    count += 1

かかった時間は

real    0m5.502s
user    0m5.414s
sys 0m0.010s

私はそれぞれ約10回実行しましたが、2つの間のリアルタイムの差は常に〜300〜500ミリ秒でした.

一方、sys 時間は通常、約 1 ~ 2 ミリ秒の差でした。(最大約 10 ミリ秒)。

私が使用しているアプリケーションは、ミリ秒未満のパフォーマンスで約 60 ~ 90,000 のトランザクションを処理するため、これは私にとっては大きな問題です。2 つの呼び出しにこれほど大きな違いがあるのはなぜでしょうか。

編集注:以下の回答は、質問の改訂後はあまり関係ありません。元の質問の質問編集を参照してください。

4

3 に答える 3

2

それは問題ではありません。中間変数を使用せずにいくつかのロードとストアをスキップすることにより、信じられないほど小さな速度の利点がある可能性があります。変数を使用すると、一時変数の寿命が少し長くなり、メモリ使用パターンにわずかに影響する可能性がありますが、その違いは考慮する価値さえありません。 . さまざまな状況で、一方が他方より読みやすい場合があります。非常に長い行を避けるようにしてください。また、読みやすくするために式の一部を抜き出す場合は、意味のある部分を選ぶようにしてください。

于 2013-08-28T04:50:00.657 に答える
-1

前者のアプローチの欠点は、二度と使用してはならない中間変数を生成することであり、あなたまたは他の誰かがそれらの変数の 1 つを誤って作成する可能性があります (つまり、後で "val2" の代わりに "val1" を使用します)。中間値は深刻な問題ではありませんが、プログラミングのミスを引き起こすことがあります。

後者のアプローチは、少し読みにくいかもしれません。オブジェクト指向のコンテキストでは、はるかに見栄えがします。

val2 = function_a().function_b()
于 2013-08-28T04:53:12.927 に答える