为什么第二个代码段比第一个代码段运行得这么快?

时间:2019-05-01 12:33:29

标签: python

我对同一功能有两种不同的看法:

def is_prime(number):
    for denominator in range(2, number):
        if denominator ** 2 > number:
            return True
        if number % denominator == 0:
            return False
    return True

def is_prime(number):
    denominator = 2
    while denominator ** 2 <= number:
        if number % denominator == 0:
            return False
        denominator += 1
    return True

第一个代码块用于测试前10个** 5个数字大约需要30秒才能完成,第二个代码大约需要350毫秒。两种测试用例的答案都相同。
为什么性能会有如此大的差异?

注意:这个古怪是由于ctypes导入的测试性能而引起的,我知道range(math.sqrt(number))更快,我们可以使用Fermat的小定理来使其更快。

1 个答案:

答案 0 :(得分:3)

确实,代码段1有更多指令要执行,但是两个if语句只会使if语句的执行时间加倍(我在这里只使用 )。您的大部分速度都在for循环中丢失:

python -m timeit -s 'i=0' 'for x in range(1000): i+=1' 
10000 loops, best of 3: 46.4 usec per loop

python -m timeit -s 'i=0' 'while i<1000: i+=1' 
10000 loops, best of 3: 0.0299 usec per loop

您在for循环中失去了多个数量级,因此if语句相对无关紧要:

python -m timeit -s 'x=1; y=4' 'x<y'
10000000 loops, best of 3: 0.0256 usec per loop

但是,我要指出的是python3的range和python2的xrange就是这种情况。如果您使用的是python2的range(如@jdowner所指出的那样),则会提前生成整个数字列表