Python - 为什么方法2(嵌套循环)比方法1(for,while循环)更快?

时间:2015-09-24 10:47:17

标签: python

我正在努力解决项目欧拉问题,并正在测试两种方法来计算数字的素因子。在因素列表中重复是可以的。

两种方法都非常相似,但第二种方法(使用嵌套的while循环)比第一种方法快得多。有谁知道这是为什么?

提前致谢

def prime_factors_1(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    for d in range(2, n):
        while n % d == 0:
            factors.append(d)
            n /= d
    return factors


def prime_factors_2(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    d = 2
    while n > 1:
        while n % d == 0:
            factors.append(d)
            n /= d
        d += 1
    return factors

2 个答案:

答案 0 :(得分:4)

计算方法所需的步数:

  • range()已预先计算好,因此遍历n - 2个除数候选者。减少循环中的n(通过/=扩充除法运算符)不会影响迭代次数。

  • while循环将循环远离发烧候选除数,因为n随着每个除数被降低而降低,导致迭代次数减少。

n为100.对于for循环,这意味着为98次迭代。但对于while循环,您得到:

  1. while 100 > 1为真,100 % 2 == 0为真,因此n /= 2将此值减少为50.然后到25,然后d增加到3,下一次迭代开始。
  2. while 25 > 1,为真,25 % 3 == 0为false,因此d会增加到4
  3. while 25 > 1,为真,25 % 4 == 0为false,因此d会增加到5
  4. while 25 > 1,为真,25 % 5 == 0为真,因此n /= 5n缩减为5,然后1
  5. 在外循环的仅4步中,您确定了除数。 4<< 98。

答案 1 :(得分:-1)

如果您使用python2,则以下行会产生差异(在第一种方法中):

for d in range(2, n):
Python2中的

range()创建了一个完整的数字列表,对于大的n值,这可能代表一个重要的开销。因此最好使用xrange()返回一个迭代器 - 一个知道如何根据需要逐个产生值的对象,而不必事先创建它们并将它们保存在内存中