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

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确实有更多指令要执行,但是两个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所指出的那样),则会提前生成整个数字列表

关于python - 为什么第二个代码段比第一个代码段运行得这么快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55936357/

10-11 23:55