如果有人能够向我解释为什么下面的代码会产生如此多的额外开销,我希望如此。在100k次迭代中,两种情况下的速度都相同(2.2秒)。当增加到1E6次迭代时,情况“B”永远不会结束,而情况“A”只需要29秒。
案例“A”
while n is not 1:
foo
案例“B”
while n > 1:
foo
如果有任何帮助,请填写完整的代码
def coll(n):
count = 0
# while n is not 1:
while n > 1:
count += 1
if not n % 2:
n /= 2
else:
n = 3*n + 1
return count
for x in range(1,100000):
count = coll(x)
答案 0 :(得分:4)
首先,您应该使用n > 1
或n != 1
,而不是n is not 1
。后者工作的事实是一个实现细节,显然它不适合你。
它不起作用的原因是因为代码中有x
的值会导致Collatz序列超过sys.maxint
的值,从而将n
变为long
1}}。然后,即使它最终回到1
,它实际上是1L
; long
,而不是int
。
尝试使用while n is not 1 and repr(n) != '1L':
,它会按预期工作。但是不要这样做;只需使用n > 1
或n != 1
。
答案 1 :(得分:2)
通常在Python中,is
检查起来非常快,因为它使用引用相等性,所以需要检查的是两个对象具有相同的内存位置。请注意,您的代码工作的唯一原因是Python的大多数实现通常会维护较小整数的池,因此每个1
始终引用相同的1
,例如,可能存在多个代表1000
的对象。在这些情况下,n is 1000
会失败,n == 1000
会起作用。您的代码依赖于此整数池,这是有风险的。
>
涉及函数调用,在Python中相当慢:n > 1
转换为n.__gt__(1)
。