0

私のプログラミングの基礎の先生は、クラスの 1 つで、「break」または「continue」キーワードを使用すると、ブール値を使用してループを終了するよりも効率が悪いと言いました。

これが当てはまるかどうかを確認するために、Python で記述されたプログラムを作成して実行しました。

import time;

TIMES = 100000000
COMPARE_FROM = "foo"
COMPARE_TO = "roo"

def breakTest() :
    while(True) :
        break;
        if(COMPARE_FROM == COMPARE_TO) :
            boo = "boo"

def booleanTest() :
    running = True;
    while(running) :
        running = False;
        if(running):
            if(COMPARE_FROM == COMPARE_TO) :
                boo = "boo"

def main() :
    breakTimeBefore = 0;
    breakTimeAfter = 0;
    booleanTimeBefore = 0;
    booleanTimeAfter = 0;

    print("running break test ...");

    breakTimeBefore = time.time();
    for i in range(0, TIMES, 1):
        breakTest();
    breakTimeAfter = time.time();

    print("break test complete");
    print("Time: %f seconds \n" % (breakTimeAfter - breakTimeBefore));

    print("running boolean test ...");

    booleanTimeBefore = time.time();
    for i in range(0, TIMES, 1):
        booleanTest();
    booleanTimeAfter = time.time();

    print("boolean test complete");
    print("Time: %f seconds \n" % (booleanTimeAfter - booleanTimeBefore))

    print("---- FINDINGS ----");
    print("breakTest time:   %f" % (breakTimeAfter - breakTimeBefore));
    print("booleanTest time: %f" % (booleanTimeAfter - booleanTimeBefore));
    print("diffrence:        %f" % ((breakTimeAfter - breakTimeBefore) - (booleanTimeAfter - booleanTimeBefore)));
    input("Press enter to close...");

main();

3 回実行して結果を平均したところ、breakTest の方が 6.25 秒高速であることがわかりました。

break キーワードはより効率的ですか、それとも私のコードは間違っていますか?

4

2 に答える 2

4

あなたのテストは完全に同等ではありません。先生は次のようなことを念頭に置いていたのではないかと思います。

def breakTest():
    i = 0
    while True:
        i += 1
        if i == 10:
            break

def booleanTest():
    i = 0
    while i < 10:
        i += 1

以下に示すように、条件を if/break の代わりに while ステートメントに入れると、パフォーマンスが向上します (そしてコードが短くなります)。

In [14]: %timeit breakTest()
1000000 loops, best of 3: 999 ns per loop

In [15]: %timeit booleanTest()
1000000 loops, best of 3: 201 ns per loop

これは、ループを終了するさまざまな方法の単なる例であり、先生が意図したことだと思います。もちろん、実際にこのコードを書いているのであれば、for i in range(11): ...

于 2012-12-12T17:24:26.883 に答える
2

コンピュータ プログラミングの入門コースでは、通常、ベスト プラクティスではなく、このようなことを自明の理として教えています。これは、ベスト プラクティスが努力する価値があることを経験の少ない人に納得させるのは難しい傾向があるためです。break可能な場合はandを使用しないcontinueでください。ただし、これらは、他のメカニズムを使用して管理できない、または少なくともきれいに管理できない正当なユースケースを満たします。プログラミングを初めて学ぶときに行うことについては、 や のようなものに頼ることは、怠惰で面倒な解決策にbreakなりcontinueがちなので、避けるようにしてください。正当にそれらが必要になるまでには、十分な知識と経験を身につけて、自分で最善の判断を下せるようにしておく必要があります。

于 2012-12-12T17:29:25.350 に答える