Python循环速度

时间:2015-08-30 00:52:42

标签: python performance while-loop overhead

如果有人能够向我解释为什么下面的代码会产生如此多的额外开销,我希望如此。在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)

2 个答案:

答案 0 :(得分:4)

首先,您应该使用n > 1n != 1,而不是n is not 1。后者工作的事实是一个实现细节,显然它不适合你。

它不起作用的原因是因为代码中有x的值会导致Collat​​z序列超过sys.maxint的值,从而将n变为long 1}}。然后,即使它最终回到1,它实际上是1L; long,而不是int

尝试使用while n is not 1 and repr(n) != '1L':,它会按预期工作。但是不要这样做;只需使用n > 1n != 1

答案 1 :(得分:2)

通常在Python中,is检查起来非常快,因为它使用引用相等性,所以需要检查的是两个对象具有相同的内存位置。请注意,您的代码工作的唯一原因是Python的大多数实现通常会维护较小整数的池,因此每个1始终引用相同的1,例如,可能存在多个代表1000的对象。在这些情况下,n is 1000会失败,n == 1000会起作用。您的代码依赖于此整数池,这是有风险的。

>涉及函数调用,在Python中相当慢:n > 1转换为n.__gt__(1)