代码之家  ›  专栏  ›  技术社区  ›  Alan

Python while循环速度

  •  1
  • Alan  · 技术社区  · 9 年前

    如果有人能告诉我为什么下面的代码有这么多额外的开销,我会很乐意。在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 回复  |  直到 9 年前
        1
  •  4
  •   Cyphase    9 年前

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

    它不起作用的原因是 x 导致Collatz序列超过 sys.maxint ,它会转动 n 进入 long 。然后,即使它最终回到 1 实际上 1L ; 一 长的 ,不是 int .

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

        2
  •  2
  •   iobender    9 年前

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

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