0

次のコードがあります

def isIt(arg):
    isA = funcA(arg)
    isB = funcB(arg)

    return (isA and isB)

ここで、funcB() は funcA よりも計算コストが高く、半数以上のケースで funcA() は False です。

したがって、funcA が True の場合にのみ Python で funcB を呼び出すようにすると意味があります。

def isIt(arg):
    return (funcA(arg) and funcB(arg))

リソースの消費を考慮した場合、これら 2 つの機能は同じですか? funcB() がジェネレーターの any() の場合はどうなりますか?

編集 1: 最初のコードのように書くという私の意図は、 funcA() と funcB() へのパラメーター ( arg ではない) が非常に長く、読みやすさを損なうのに十分であるということです。

ps。変数の代わりに 2 つのローカル関数を作成して、2 番目のコードと同じ効果を実現できることに気付きました。

4

4 に答える 4

2

リソースの消費を考慮した場合、これら 2 つの機能は同じですか?

それらは機能的に同じではありません。質問でこれを理解しているようですので、何を疑っているのかよくわかりませんが、これはリソースの消費を考慮する場合に特に重要です。

def isIt(arg):
    lightweightResult = lightweightFunction(arg)
    expensiveResult = superExpensiveFunction(arg)

    // obviously you can use both results here, so both have been computed.


    // return the values directly, no further computation done here:
    return (lightweightResult and expensiveResult)

このようにする理由の 1 つはexpensiveResult、他の何かが必要な場合、またはsuperExpensiveFunctionリソースの初期化子など、常に呼び出す必要がある場合です。

2 番目のケースでは、説明したように、 true と評価されたfuncB(arg)場合にのみ評価funcA(arg)されます (真の値を返します)。これは短絡と呼ばれます。

def isIt(arg):
    return (lightweightFunction(arg) and superExpensiveFunction(arg))

ショート サーキットは、不必要な実行を防ぐ良い方法であることがよく知られています。

ジェネレーターで funcB() が any() の場合はどうなりますか?

いずれかが呼び出されない限り、ジェネレーターは実行されません。ジェネレーターは遅延評価されるため、不要な実行を防ぐための優れた方法です。この場合、短絡と発電機は良い組み合わせになると思います。

Blkknghtのコメントで指摘されているように、ショートサーキットもあることany()に注意する価値があるall()ため、ジェネレーターでは、結果を確認する要素 (すべてで false またはいずれかで true) までのみジェネレーターが評価されます。コードはpython.org...#allで確認できます。

于 2013-09-21T03:18:48.007 に答える