我正在努力解决项目欧拉问题,并正在测试两种方法来计算数字的素因子。在因素列表中重复是可以的。
两种方法都非常相似,但第二种方法(使用嵌套的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
答案 0 :(得分:4)
计算方法所需的步数:
range()
已预先计算好,因此将遍历n - 2
个除数候选者。减少循环中的n
(通过/=
扩充除法运算符)不会影响迭代次数。
while
循环将循环远离发烧候选除数,因为n
随着每个除数被降低而降低,导致迭代次数减少。
说n
为100.对于for
循环,这意味着将为98次迭代。但对于while
循环,您得到:
while 100 > 1
为真,100 % 2 == 0
为真,因此n /= 2
将此值减少为50.然后到25,然后d
增加到3,下一次迭代开始。 while 25 > 1
,为真,25 % 3 == 0
为false,因此d
会增加到4
while 25 > 1
,为真,25 % 4 == 0
为false,因此d
会增加到5
while 25 > 1
,为真,25 % 5 == 0
为真,因此n /= 5
将n
缩减为5
,然后1
。在外循环的仅4步中,您确定了除数。 4<< 98。
答案 1 :(得分:-1)
如果您使用python2,则以下行会产生差异(在第一种方法中):
for d in range(2, n):
Python2中的 range()
创建了一个完整的数字列表,对于大的n值,这可能代表一个重要的开销。因此最好使用xrange()
返回一个迭代器 - 一个知道如何根据需要逐个产生值的对象,而不必事先创建它们并将它们保存在内存中