42

これはCで非常に一般的です:次のように「空のifステートメント」をハッキングします。

if(mostlyhappencondition)
    ;#empty statement
else{
    dosomething;
}

Pythonで動作していますか?つまり、それを使用してアプリのパフォーマンスを向上させることはできますか?理由も知りたいです。

4

5 に答える 5

51

バイトコードは実行を「if」ケースに渡さないため、「if」に else ケースがない場合、パフォーマンスが向上します。

ここにいくつかの関数と出力がありますdis.dis(foo)

次のサンプル アプリ:

def foo(x):
    if x:
        pass
    else:
        return x+2

以下に逆アセンブルします。

5           0 LOAD_FAST                0 (x)
            3 POP_JUMP_IF_FALSE        9

6           6 JUMP_FORWARD             8 (to 17)

8     >>    9 LOAD_FAST                0 (x)
           12 LOAD_CONST               1 (2)
           15 BINARY_ADD          
           16 RETURN_VALUE        
      >>   17 LOAD_CONST               0 (None)
           20 RETURN_VALUE        

以下

def foo(x):
    if not x:
        return x+2

以下に逆アセンブルします。

11           0 LOAD_FAST                0 (x)
             3 POP_JUMP_IF_TRUE        14

12           6 LOAD_FAST                0 (x)
             9 LOAD_CONST               1 (2)
            12 BINARY_ADD          
            13 RETURN_VALUE        
       >>   14 LOAD_CONST               0 (None)
于 2013-02-26T05:11:02.067 に答える
25

pass構文エラーを防ぐために空のコード ブロックを作成する必要があるステートメントを探しているとしか思えません。

if mostlyhappencondition:
    pass
else:
    do_something()

これを行う方がはるかに一般的であり、これは論理的に同等です。

if not mostlyhappencondition:
    do_something()

ここでは、大幅なパフォーマンスの向上は見られません。

于 2013-02-26T04:48:56.457 に答える
4

if True:あなたにできることが何もない時まで

if not mostlyhappenedcondition:
   do something()

今後も「if」に何も入れる必要がない場合は、コードが冗長になります。

于 2013-02-26T04:52:08.140 に答える
3

いいえ、パフォーマンスは向上しません。実際、Cにもありません。どこで聞いたの?

not/!読みやすく、ほぼ同じ速度である必要があります。


そして実際にテストされたgcc -O4

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i = 0; i < 1000000000; i++) {
        if(!(i < 900000000)) {
            putchar('.');
        }
    }
}

対。

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i = 0; i < 1000000000; i++) {
        if(i < 900000000);
        else {
            putchar('.');
        }
    }
}

私のコンピューターでは、#1は6.62秒、#2は6.64秒かかりました。

于 2013-02-26T04:45:57.863 に答える