5

Python で関数内に関数を定義するのは悪いことだとどこかで読みました。これは、外側の関数が呼び出されるたびに Python が新しい関数オブジェクトを作成するためです。誰かが基本的にこれを言った:

#bad
def f():
    def h():
        return 4
return h()

#faster
def h():
    return 4

def f(h=h):
    return h()

これは本当ですか?また、次のような定数が大量にある場合はどうでしょうか。

x = # long tuple of strings
# and several more similar tuples
# which are used to build up data structures

def f(x):
    #parse x using constants above
    return parse dictionary

すべての定数を f の定義内に入れると速くなりますか? または、それらを外部に残して、キーワード引数でローカル名にバインドする必要がありますか? 残念ながら、タイミングを行うためのデータがありません。そのため、同様の経験についてお尋ねしていると思います。

4

3 に答える 3

6

あなたの質問への短い答え - それは本当です。外部関数が呼び出されるたびに内部関数が作成され、これには時間がかかります。また、関数の外で定義されたオブジェクトへのアクセスは、ローカル変数へのアクセスに比べて遅くなります。

しかし、あなたはもっと重要な質問もしました - 「私は気にする必要がありますか?」. これに対する答えは、ほとんどの場合NOです。パフォーマンスの違いはごくわずかで、コードの可読性ははるかに重要です。

したがって、この関数が他の関数の本体に属していて、他の場所では意味がないと思われる場合は、内部に配置してパフォーマンスを気にしないでください (少なくとも、プロファイラーが別のことを通知するまでは)。

于 2013-11-03T16:08:56.960 に答える
0

私のテストでは、必要なことを行うための最速の方法は、必要なすべての定数を外部で定義し、それらの定数を外部で必要とする関数のリストを作成し、関数のリストをメイン関数に渡すことでした。dis.disテストには、cProfile.run、およびを使用timeit.timeitしましたが、ベンチマーク スクリプトが見つからず、わざわざ書き直して結果を出すことができません。

于 2013-12-02T21:50:13.477 に答える