在这种情况下,为什么while循环比范围快得多?

Ke *_* MA 2 python loops

根据这篇文章,范围循环应该比python中的while循环更快,但请看下面的代码.它仅用于测试数字是否为素数,如果n不是素数则返回除数.

import time

def isPrimeWhile(n):
    i = 2
    while(i <= n/2+1):
        if(n%i == 0):
            return i
        i += 1
    return n

def isPrimeRange(n):
    for i in range(2,n/2+1):
        if(n%i == 0):
            return i
    return n

n = 353591872901

start = time.time()
isPrimeWhile(n)
print("%s while seconds"%(time.time() - start))

start = time.time()
isPrimeRange(n)
print("%s range seconds"%(time.time() - start))
Run Code Online (Sandbox Code Playgroud)

运行代码,你会发现while循环比range循环快得多.我猜测范围(0,aLargeNumber)需要很长时间才能运行.但为什么在上面提到的上一篇文章中,范围方法要快得多?任何答案?

Ser*_*lis 7

由于您使用的是Python 2+(您的代码需要使用整数除法在Python 3+中工作),因此您会遇到Python 2+ range生成所有元素的列表然后迭代它们的事实.

这可以解释运行whilerange运行函数所需的时间差异.

在Python 3+的代码中,需要进行以下更改:

def isPrimeRange(n):
    for i in range(2,n//2+1): # integer division
        if(n%i == 0):
            return i
    return n 
Run Code Online (Sandbox Code Playgroud)

这篇Python博客文章详细解释了Python 2+中range(返回列表)和xrange(返回迭代器)之间的区别以及Python 3+如何更改此功能.

从这个来源中选出最相关的段落是:

当您使用迭代器时,for语句的每个循环都会动态生成下一个数字.原始range()函数在for循环开始执行之前立即生成所有数字.原始range()函数的问题在于它在生成大量数字时使用了大量内存.但是,只需少量数字就可以更快.请注意,在Python 3.x中,您仍然可以通过将返回的生成器传递给list()函数来生成列表.