Python while循环速度

Python while loop speed

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

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

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

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

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

尝试使用 while n is not 1 and repr(n) != '1L':,它将如您所愿地工作。但是不要那样做;只需使用 n > 1n != 1.