Break vs Boolean?

时间:2012-12-12 17:08:40

标签: python boolean break continue memory-efficient

我的编程基础知识老师在她的一个课程中说过,使用“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();

运行三次,并对结果取平均值后,我发现breakTest的速度提高了6.25秒。

break关键字更有效率还是我的代码错了?

2 个答案:

答案 0 :(得分:4)

您的测试并不完全相同。我认为你的老师可能会考虑以下内容:

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

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

如下所示,将条件放入while语句而不是if / break确实可以提高性能(并缩短代码):

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): ...

答案 1 :(得分:2)

简介计算机程序设计课程通常会教你这样的事情,而不是最佳实践,因为很难说服那些经验不足的人认为最佳实践值得付出努力。您应该尽可能避免使用breakcontinue,但它们会满足无法管理的合法用例,或者至少无法使用其他机制进行干净管理。对于你在第一次学习编程时所做的事情,依靠breakcontinue之类的东西往往是懒惰,凌乱的解决方案,所以你应该试着避免它们。当你合法地需要它们时,你应该有足够的知识和经验来使用你自己最好的判断。