3

timeitを使用してさまざまな関数をテスト(タイミング)することで、いくつかのPythonコードを最適化しようとしています。

変数がキーワード引数であるか関数内であるかによって、速度が異なることがわかりました。

あれは:

def test_function(A = value()):
    #rest of function....

次とは異なる結果を返しています:

def test_function():
    A = value()
    #rest of function ...

私はそれらが非常に類似した結果をもたらすだろうと思ったでしょう-私はここで何かを理解していない/欠けていると推測しています...

(テストでも10,000ループを実行します)

4

3 に答える 3

12

キーワード引数は、関数定義時に1回評価されます。したがって、最初の例value()では、テスト関数を何度呼び出しても、1回だけ呼び出されます。value()高価な場合、これは2つのバージョン間の実行時の違いを説明します。

于 2012-11-14T03:58:15.163 に答える
4

2つの関数が同じことを実行することを期待する必要がある理由はありません。ましてや、同じパフォーマンス特性を持っていることは言うまでもありません。

def test_function(A = value()):
    #rest of function....

この関数には「キーワード引数」がありません。そのようなことはありません。デフォルト値の引数があります。任意の関数の任意のパラメーター(一部の扱いにくい組み込み関数は別として)は、キーワードまたは位置で渡すことができますが、引数は本質的に「キーワード引数」ではありません。

キーワード引数とデフォルト値の唯一の関連は、デフォルト値を持つ複数の引数がある場合、前の引数のデフォルトを受け入れながら後の引数に明示的な値を提供する唯一の方法は、後の引数をキーワードで渡すことです。

2つの関数の大きな違いは、のデフォルト値を宣言するとA、それがデフォルトであり、明示的な値が指定されていない場合に毎回値を再生成するコードではないことです。あなたがこれを言うとき:

def test_function(A = value()):
    #rest of function....

のデフォルトを設定していますA。他のコンテキストと同様に、Pythonが値を必要とする複雑な式を提供すると、Pythonはその式を評価し、結果の値を使用します。Aしたがって、関数定義時にデフォルト値を設定するvalue()と、その時点で返されるものに設定されます。その場合、その1つの値がのデフォルト値になりますA

def test_function():
    A = value()
    #rest of function ...

この関数でvalue()は、関数が呼び出されるたびに評価されます。したがって、value()高価な場合、このバージョンは最初のバージョンよりもはるかに時間がかかります。ただし、value()後で変更するオブジェクトを返す場合、デフォルト引数バージョンは、関数が呼び出されたときの状態に関係なく、常に1つのオブジェクトを使用しますが、2番目のバージョンはvalue毎回新しいオブジェクトを作成します。 。使用するバージョンは、プログラムに持たせたいセマンティクスによって決定する必要があります。

于 2012-11-14T04:08:04.937 に答える
4

この方法がアプローチの有効性を判断するのに最適ではない理由についての議論がありますがdis、関数のバイトコードを検査するために使用すると、それらがさまざまな方法で構造化されていることがわかります。つまりt1、デフォルトの引数を評価します。定義された時間であるため、後続の関数呼び出しで再定義する必要はありません。

>>> import dis
>>> def t1(A=1):
...   pass
>>> def t2():
....  A=1
>>> dis.dis(t1)
  2           0 LOAD_CONST               0 (None)
              3 RETURN_VALUE        
>>> dis.dis(t2)
  2           0 LOAD_CONST               1 (1)
              3 STORE_FAST               0 (A)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE        
于 2012-11-14T04:02:35.577 に答える