Python 显示整数一样长?

Python displaying ints as long?

这里有两个函数可以求一个数的质因数。 致谢:三联画

def prime_factors1(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 = d + 1

    return factors

def prime_factors2(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 = d + 1
        if d*d > n:
            if n > 1: factors.append(n)
            break
    return factors        

很明显第二个代码运行速度快很多,但是为什么它输出的最大因子是long-type而不是int?

>>> prime_factors1(65126264424)
[2, 2, 2, 3, 13, 29, 7197863]

>>> prime_factors2(65126264424)
[2, 2, 2, 3, 13, 29, 7197863L]

区别如下。在prime_factors1(n)中,最后一个因素附加在这里:

while n > 1:
    while n % d == 0:
        factors.append(d)

其中 d2 开始(无论哪个运行时都肯定是 int),通过 d = d + 1 增长(两个 int 相加)并且 - 当它作为一个因素附加时 - 位于 7197863 (仍然是 int)。

然而,在 prime_factors2(65126264424) 中,您在此处附加最后一个因子:

if d*d > n:
    if n > 1: factors.append(n)

其中 n65126264424 开始并通过 n /= d 缩小。如果 nlong 开头(如果 nlongdint,则这不会更改 n 的类型,无论多小,结果仍然是 long)。因此问题变成:Is 65126264424 a long?

答案取决于您的 python 运行时间:

  1. 在 32 位运行时,您通常有 32 位整数,最大值为 (2**31 - 1)2147483647,小于 65126264424
  2. 在 64 位运行时,您通常有 64 位整数,最大值为 (2**63 - 1)9223372036854775807,大于 65126264424

查看 sys.maxint 的输出,它应该小于 65126264424